Kotlin安卓开发:导入外部数据库
发表于更新于
广州
开发androidKotlin安卓开发:导入外部数据库
❄️2winter
- 涉及到内部数据库的创建使用。
- 外部数据库的导入。
- kotlin的文件读写。
最近在写一个学习资料类的应用。
现在写到题库部分。
思路是:事先准备好外部的数据库(就是题库了),然后,程序第一次运行时候,首先创建内部数据库,然后将外部数据库复制到内置,外置数据库文件在assets里面。内置的在/data/data/com.包名/databases/数据库名
首先写一个SQL类,用来创建程序内置数据库,这个数据库结构和外部要一致!初始化是空的。
mySql类:用来初始化内置类,程序运行第一次会初始化一个数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class mySql(context: Context,name:String,version:Int ):SQLiteOpenHelper(context,name,null,version) {
val Create_ = "Create table sj(id integer primary key autoincrement,name varchar);"
val mContext = context var sjs = arrayListOf<Map<String, Any>>() override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) { }
override fun onCreate(db: SQLiteDatabase?) { try { db!!.execSQL(Create_) Log.d("dbInit","") Toast.makeText(mContext, "初始化数据库", Toast.LENGTH_SHORT).show() } catch (e: NullPointerException) { println(e) } }
fun wen_query( db: SQLiteDatabase, hand: Handler): Boolean { xxx return false } }
|
在main活动里:初始化这个数据库对象(不用担心以后会被覆盖)
1 2
| val temSql = mySql(this@MainActivity,"glx",1)//初始化数据库 //参数:context,数据库名,版本(随意)
|
然后,我们就要把外置的数据库复制过来了。
看看ImportDB类,用来复制我们外面的数据库文件:这里一定注意,会有很多问题出现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class ImportDB internal constructor(private val context: Context) { private val BUFFER_SIZE =10000 companion object { val DB_NAME = "glx" val PACKAGE_NAME = "com.simplewen.win0" val DB_PATH = ("/data${Environment.getDataDirectory().absolutePath}/$PACKAGE_NAME/databases") } fun copyDatabase():Boolean{ val dbfile = "$DB_PATH/$DB_NAME" Log.d("look",dbfile) try {
val db = this.context.resources.assets.open("glx") val fos = FileOutputStream(dbfile) val buffer = ByteArray(BUFFER_SIZE) var count = 0 while ({ count = db.read(buffer);count}() > 0) { fos.write(buffer, 0, count) } fos.close() db.close() return true }catch (e: Throwable) { Log.d("look",e.toString()) e.printStackTrace() return false }
}
}
|
我们看看主活动:这里思路,当数据库初始化以后,我们开始导入外部数据库,如果导入完成,设置flag为1,下次启动检测,防止重复导入。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| val file = File(ImportDB.DB_PATH + "/glx") Log.d("here",ImportDB.DB_PATH) val share = getSharedPreferences("dbFlag", Activity.MODE_PRIVATE)
if (file.exists()){ Toast.makeText(this@MainActivity, "存在内部数据库", Toast.LENGTH_SHORT).show() if(share.getString("dbFlag","0") == "1"){ Toast.makeText(this@MainActivity, "已经导入过数据库", Toast.LENGTH_SHORT).show() }else{ val inDb = ImportDB(this@MainActivity) if(inDb.copyDatabase()){ Toast.makeText(this@MainActivity, "复制完成", Toast.LENGTH_SHORT).show() val shareP = getSharedPreferences("dbFlag", Activity.MODE_PRIVATE) val edit = shareP.edit() edit.putString("dbFlag","1") edit.apply() }else{ Toast.makeText(this@MainActivity, "复制失败", Toast.LENGTH_SHORT).show() } }
}
|
最后,看看具体使用:在另一个FG里面使用:这个时候,由于数据库已经存在,再初始化一个对象,将会默认使用新的数据库。
调用,db.query(xxx)…
1 2 3 4
| val temSql = mySql(activity,"glx",1) xxx val db = temSql.writableDatabase
|
好了,这个问题,网上太多java的资料了,kt很少,这里和kt小伙伴分享一下,小总结。
这里用到的kt文件流,思路来自:https://www.cnblogs.com/dwb91/p/9049537.html。
❄️2winter
ReactNative FullStack Developer
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ❄️2winter!