如何sqllite数据库复制到android手机上
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何sqllite数据库复制到android手机上相关的知识,希望对你有一定的参考价值。
我用eclipse开发程序时在PC上就把sqllite数据库创建好了,但是如果把这个数据库包直接发布到android手机上啊,因为我有一些初始化程序设置的配置参数信息,请高手 们指点。。。
你是说直接打包到apk包中么?1.把你的.sqlite文件打包成zip文件放在Assert目录下。
2.在程序第一次运行时,Activity.getAssert()函数读助assert目录下的sqlite文件,复制到你想要的目录下(一般是sd卡目录下,不过要注意的就是 要检查sd卡是否存在)
3.用SqliteDataBase.openDataBase()函数打开数据库,进行各种操作。
--------------------------
但你的需求,如果只是配置信息,用SharedPreferences 来做不是更方便么? 参考技术A 可以将数据库.db文件复制到Android工程的res raw文件夹中
1、在Android中不能直接打开res raw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中
2、然后再打开该数据库文件,复制的基本方法是使用getResources().openRawResource方法获得res raw目录中资源的InputStream对象
3、然后将该InputStream对象中的数据写入其他的目录相应的文件中
4、最后可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件. 参考技术B 用Eclipse直接导进去就行啦
Android jetpack room SQLLite 数据库 修改字段
由于sqlLite 修改字段比较复杂。所以建议销毁、复制数据。然后重建数据
将Sex 字段由Int转换为String
修改数据bean
package com.anguomob.jecpack.bean
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.Ignore
import androidx.room.PrimaryKey
@Entity(tableName = "student")
data class Student(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id", typeAffinity = ColumnInfo.INTEGER)
var id: Int,
@ColumnInfo(name = "name", typeAffinity = ColumnInfo.TEXT)
var name: String,
@ColumnInfo(name = "age", typeAffinity = ColumnInfo.INTEGER)
var age: Int,
/**
* V3
*/
// @ColumnInfo(name = "sex", typeAffinity = ColumnInfo.INTEGER)
// var sex: Int,
/**
* V4
*/
@ColumnInfo(name = "sex", typeAffinity = ColumnInfo.TEXT)
var sex: String,
@ColumnInfo(name = "bar_data", typeAffinity = ColumnInfo.INTEGER)
var bar_data: Int
)
@Ignore
constructor(name: String, age: Int) : this(0, name, age, "M", 1)
@Ignore
constructor(id: Int) : this(id, "", 0, "M", 1)
具体操作
package com.anguomob.jecpack.database
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import com.anguomob.jecpack.bean.Student
import com.anguomob.jecpack.dao.StudentDao
import okhttp3.internal.Internal.instance
@Database(entities = [Student::class], version = 4, exportSchema = true)
abstract class MyDataBase : RoomDatabase()
companion object
var DATABASE_NAME = "my_db.db"
private lateinit var instance: MyDataBase
//数据库从1 到2 版本的升级
var MIGATION_1_2: Migration = object : Migration(1, 2)
override fun migrate(database: SupportSQLiteDatabase)
//新增性别
database.execSQL("ALTER TABLE student ADD COLUMN sex INTEGER NOT NULL DEFAULT 1")
var MIGATION_2_3: Migration = object : Migration(2, 3)
override fun migrate(database: SupportSQLiteDatabase)
//新增性别
database.execSQL("ALTER TABLE student ADD COLUMN `bar_data` INTEGER NOT NULL DEFAULT 1")
var MIGATION_3_4: Migration = object : Migration(3, 4)
override fun migrate(database: SupportSQLiteDatabase)
//修改性别字段为Text
// 1、 创建临时表
database.execSQL(
"CREATE TABLE `temp_student` ("
+ "`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ "`name` TEXT NOT NULL, "
+ "`age` INTEGER NOT NULL, "
+ "`sex` TEXT NOT NULL DEFAULT 'M',"
+ " `bar_data` INTEGER NOT NULL"
+ ")"
)
//2 复制数据
database.execSQL(
"INSERT INTO `temp_student` (name,age,sex,bar_data)"
+ "SELECT name,age,sex,bar_data FROM student"
)
//3 删除原来表
database.execSQL("DROP TABLE STUDENT")
//4 重命名
database.execSQL("ALTER TABLE temp_student RENAME TO student")
//修改原来的表的数据为正常数据
database.execSQL(
"update student set sex = 'M' where sex = '1'"
)
database.execSQL(
"update student set sex = 'F' where sex = '2'"
)
fun getSingle(context: Context): MyDataBase
if (::instance.isInitialized.not())
instance = Room.databaseBuilder(
context.applicationContext,
MyDataBase::class.java,
DATABASE_NAME
)
// .allowMainThreadQueries()//允许主线程操作数据库
.addMigrations(MIGATION_1_2, MIGATION_2_3, MIGATION_3_4)
//出现异常问题 重建数据表,同时数据也会丢失。
.fallbackToDestructiveMigration()
.build();
return instance;
abstract fun getStudentDao(): StudentDao
重点关注代码 MIGATION_3_4里面的sql语句
以上是关于如何sqllite数据库复制到android手机上的主要内容,如果未能解决你的问题,请参考以下文章