android 保存到数据库,Android---把数据保存到数据库中(一)

把重复的或结构化的数据(如通信录信息)保存到数据库中是很好的想法。本节课假设你熟悉通常的SQL数据库,并帮助你在Android平台上开始使用SQLite数据库。在Android平台上,你需要使用的数据库API包含在android.database.sqlite包中。

定义模式和约束

SQL数据的一个主要原则是模式:数据库是如何组织的一个正式声明。模式被反映在你用于创建数据库的SQL语句中。你可能会发现,它有助于创建伴侣类,即约束(contract)类,这个类使用系统性的和自记录的方式来明确的指定你的模式的布局。

约束(contract)类是一个定义URIs、表名和列名的常量容器。在相同包中的所有类都可以使用这个约束类中的常量。这样就会一处修改,全局有效。

组织约束类的一个好方法是把定义放到类的根层次,以便它对整个数据库有效。

注意:通过实现BaseColumns接口,你的内部类会继承一个叫做_ID的主键,某些Android类(如游标适配器)会希望有这个字段。它不是必须的,但是,这个字段会帮助你的数据库跟Android框架更和谐的工作。

例如,以下代码片段定义一个表的表名和列名:

publicstaticabstractclassFeedEntryimplementsBaseColumns{public static final String TABLE_NAME = "entry";

public static final String COLUMN_NAME_ENTRY_ID = "entryid";

public static final String COLUMN_NAME_TITLE = "title";

public static final String COLUMN_NAME_SUBTITLE = "subtitle";

...

}

为了防止约束类被意外的实例化,它的构造器是私有的:

// Prevents the FeedReaderContract class from being instantiated.privateFeedReaderContract() {}

使用SQL辅助器来创建数据库

一旦你定义了你的数据库,你就应该实现创建和维护数据库以及表的方法。以下是创建和删除表的典型语句:

privatestaticfinalStringTEXT_TYPE=" TEXT";privatestatic final String COMMA_SEP = ",";

private static final String SQL_CREATE_ENTRIES =

"CREATE TABLE " + FeedReaderContract.FeedEntry.TABLE_NAME + " (" +

FeedReaderContract.FeedEntry._ID + " INTEGER PRIMARY KEY," +

FeedReaderContract.FeedEntry.COLUMN_NAME_ENTRY_ID + TEXT_TYPE + COMMA_SEP +

FeedReaderContract.FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +

... // Any other options for the CREATE command

" )";

private static final String SQL_DELETE_ENTRIES =

"DROP TABLE IF EXISTS " + TABLE_NAME_ENTRIES;

就像你在设备的内部存储器上保存文件那样,Android会在跟应用程序关联的私有的硬盘空间中保存你的数据库。因为默认情况下,这块区域对其他应用程序来说是不可访问的,所以你的数据是安全的。

使用SQLiteOpenHelper类中的一组API是有益的。因为当因使用这个类来获取数据库的引用时,系统只会在需要时和应用程序的非启动期间来执行潜在的创建和更新数据库的长时操作。你需要做所有工作就是调用getWritableDatabase()或getReadableDatabase()方法。

注意:因为它们是长时操作,所以必须确保在后台的线程中调用getWritableDatabase()和getReadableDatabase()方法,如在或中调用。

要使用SQLiteOpenHelper,就要继承SQLiteOpenHelper类来创建一个子类,并重写onCreate()、onUpgrade()和onOpen()回调方法,还可以选择性的实现onDowngrade()回调方法。

例如,以下是SQLiteOpenHelper类的一个子类实现:

publicclassFeedReaderDbHelperextendsSQLiteOpenHelper{// If you change the database schema, you must increment the database version.

public static final int DATABASE_VERSION = 1;

public static final String DATABASE_NAME = "FeedReader.db";

public FeedReaderDbHelper(Context context) {

super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

public void onCreate(SQLiteDatabase db) {

db.execSQL(SQL_CREATE_ENTRIES);

}

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

// This database is only a cache for online data, so its upgrade policy is

// to simply to discard the data and start over

db.execSQL(SQL_DELETE_ENTRIES);

onCreate(db);

}

public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {

onUpgrade(db, oldVersion, newVersion);

}

}

使用以下方法来访问你的数据库:

FeedReaderDbHelpermDbHelper=newFeedReaderDbHelper(getContext());

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 将图片的绝对路径保存到 Room 数据库可以分为以下步骤: 1. 创建实体类:创建一个实体类,用于表示图片的信息,包括 ID、文件名、文件路径等属性。 2. 创建 DAO 接口:创建一个 DAO 接口,定义插入、更新、查询等操作。 3. 创建数据库:创建一个 Room 数据库,包含一个或多个表,每个表对应一个实体类。 4. 插入数据:使用 DAO 接口的插入操作将图片的信息插入到数据库。 具体实现如下: 1. 创建实体类 ```kotlin @Entity(tableName = "image") data class Image( @PrimaryKey(autoGenerate = true) val id: Int = 0, val fileName: String, val filePath: String ) ``` 2. 创建 DAO 接口 ```kotlin @Dao interface ImageDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertImage(image: Image) @Update suspend fun updateImage(image: Image) @Query("SELECT * FROM image WHERE id = :id") suspend fun getImageById(id: Int): Image? @Query("SELECT * FROM image") suspend fun getAllImages(): List<Image> } ``` 3. 创建数据库 ```kotlin @Database(entities = [Image::class], version = 1, exportSchema = false) abstract class AppDatabase : RoomDatabase() { abstract fun imageDao(): ImageDao companion object { @Volatile private var INSTANCE: AppDatabase? = null fun getInstance(context: Context): AppDatabase { return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext, AppDatabase::class.java, "app_database" ).build() INSTANCE = instance instance } } } } ``` 4. 插入数据 ```kotlin val image = Image(fileName = "test.jpg", filePath = "/storage/emulated/0/DCIM/Camera/test.jpg") val dao = AppDatabase.getInstance(context).imageDao() dao.insertImage(image) ``` 这样,就可以将图片的绝对路径保存到 Room 数据库了。需要注意的是,图片的绝对路径可能会发生变化,例如升级 Android 版本或更换设备,因此建议使用相对路径或 ContentProvider URI 来保存图片信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值