一、room数据库的使用
在Android开发中,要使用数据存储时,第一想到的就是room数据库。
room数据库的使用分为已下几部:
1.导入依赖
def roomVersion = "2.4.1" implementation ("androidx.room:room-runtime:$roomVersion")kapt ("androidx.room:room-compiler:$roomVersion")
2.实体类。数据库的表结构
@Entity data class SearchHistoryBean( //主键,自增 @PrimaryKey(autoGenerate = true) var id: Int = 0, var key: String = "" )
3.数据的增删查找操作
@Dao interface SearchHistoryDao {@Query("select * from SearchHistoryBean") fun query(): List<SearchHistoryBean>?@Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(entity: SearchHistoryBean) @Update fun update(entity: SearchHistoryBean) @Delete fun delete(entity: SearchHistoryBean)
4.创建数据库
@Database(entities = [SearchHistoryBean::class], version = 1, exportSchema = false) abstract class AppDataBase : RoomDatabase() { abstract fun searchHistoryDao(): SearchHistoryDaocompanion object {@Volatile private var instance: AppDataBase? = null fun getInstance(context: Context): AppDataBase { return instance ?: synchronized(this) { instance ?: buildDataBase(context).apply { instance = this } } }fun buildDataBase(context: Context): AppDataBase { return Room.databaseBuilder(context, AppDataBase::class.java, "xgimiMusic-database").build() } } }
到这里一个简单的room数据库就可以使用了
二、ContentProvider的使用
class HistoryProvider : ContentProvider() { private var appDataBase: AppDataBase? = null private fun getReadableDatabase(): SupportSQLiteDatabase? { return appDataBase?.openHelper?.readableDatabase } private fun getWritableDatabase(): SupportSQLiteDatabase? { return appDataBase?.openHelper?.writableDatabase } override fun onCreate(): Boolean { appDataBase = AppDataBase.getInstance(context) return true } override fun getType(uri: Uri): String? { return null } override fun insert(uri: Uri, values: ContentValues?): Uri? { val db = getWritableDatabase() ?: return null var insertUri: Uri? = null var insertId: Long = -1 try { db.beginTransaction() insertId = db.insert(SongHistoryDatabase.TABLE_NAME, SQLiteDatabase.CONFLICT_REPLACE, values) insertUri = ContentUris.withAppendedId(uri, insertId) db.setTransactionSuccessful() } catch (e: Exception) { e.printStackTrace() } finally { db.endTransaction() } return insertUri } override fun query( uri: Uri, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?, sortOrder: String? ): Cursor? { val db = getReadableDatabase() ?: return null val limitStr = uri.getQueryParameter("limit") var cursor: Cursor? = null try { db.beginTransaction() val sql = SQLiteQueryBuilder.buildQueryString( false, SongHistoryDatabase.TABLE_NAME, projection, selection, null, null, sortOrder, limitStr ) cursor = db.query(sql, selectionArgs) db.setTransactionSuccessful() } catch (e: Exception) { e.printStackTrace() } finally { db.endTransaction() } return cursor } override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int { var numRemoved: Int = -1 val db = getWritableDatabase() ?: return numRemoved try { db.beginTransaction() db.delete(SongHistoryDatabase.TABLE_NAME, selection, selectionArgs) db.setTransactionSuccessful() } catch (e: Exception) { e.printStackTrace() } finally { db.endTransaction() } return numRemoved } override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<out String>?): Int { var numUpdate: Int = -1 val db = getWritableDatabase() ?: return numUpdate try { db.beginTransaction() db.update(SongHistoryDatabase.TABLE_NAME, SQLiteDatabase.CONFLICT_NONE, values, selection, selectionArgs) db.setTransactionSuccessful() } catch (e: Exception) { e.printStackTrace() } finally { db.endTransaction() } return numUpdate } }
这里与使用传统的SQLite数据库有几个不同之处:
1.在SQLite增删查改中需要用到SQLiteDatabase去操作数据库。而room数据库提供了SupportSQLiteDatabase,SupportSQLiteDatabase同样具有增删查改方法。所有在onCreate() 需要得到RoomDatabase的子类对象,然后通过 appDataBase?.openHelper?.readableDatabase 或者 appDataBase?.openHelper?.writableDatabase 得到SupportSQLiteDatabase对象
2.在query()中,SupportSQLiteDatabase只支持入参为sql字符串,所以需要把参数转换为sql语句,SQLiteQueryBuilder.buildQueryString() 就是源码SQLiteDatabaseh中把参数转化为sql的方法,所以我们直接拿出来用就好
其他几个方法的使用RoomDatabase和SQLiteDatabase基本一致