Android 保存数据到数据库


保存数据到一个数据库对重复或结构化的数据是理想的,例如联系人信息。假定您熟悉一般的SQL数据库,有助于您在android中使用SQLite数据库,您使用android数据库的API包在“ android.database.sqlite”中。


定义架构(Schema) 和合同(Contract)

SQL 数据库主要原理之一是架构(Schema): 一个怎样组织数据库的正式声明。这架构反映在于创建数据库使用的SQL 语句,你会发现它有助于创造一个伴侣类,称为合同类,以系统,规则的和自记录的方式明确指定架构的布局。


一个合同类(Contract Class)是一个常量容器,定义URIs 名称,表以及列。合同类允许在同一个包中所有其他类中交叉使用相同的常量。这让您在一个地方更改列的名称,变化将在你的代码中传播。组织合同类的一个好办法 是把数据库的全局常量定义放在最上层父类。然后为每个表创建一个内部类,并在内部类中列举表的列。


注: 实现BaseColums的接口, 内部类可以继承一个称作为“_ID”的主键字段,一些Android类例如cursor适配器会期望有它。它不是必需的,但是这能帮助您的数据库和Android framework协同工作。


例如:这段代码为一单表定义了表名和列名

public static abstract class FeedEntry implements BaseColumns {
    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.
private FeedReaderContract() {}

使用SQL Helper 创建一个数据库

一旦你已经创建了你的数据库,你应该实现创建和维护数据库和表的方法,这里是一些创建和删除表典型声明。


private static final String TEXT_TYPE = " TEXT";
private static 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 类中有一套有用的APIs,当您使用这个类去获取数据库引用的时候,系统仅当需要的时候,执行费时的create 和update 数据库操作,应用启动的时候不会执行。您需要做的是调用getReadableDatabase()或getWritableDatabase()

注意: 因为他们可能费时执行,所以需要确保getReadableDatabase()或getWritableDatabase()在后台线程运行,例如使用AsyncTask 或IntentService。


为了使用SQLiteOpenHelper, 创建一个子类,重载oncreate() , onUpgrade() 以及onOpen() 回调方法。 您也可以实现onDowngrade(),但是不需要。

例子如下:

public class FeedReaderDbHelper extends SQLiteOpenHelper {
    // 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);
    }
}

为了访问您的数据库,实例化您的SQLiteOpenHelper子类。

FeedReaderDbHelper mDbHelper = new FeedReaderDbHelper(getContext());

put 信息到一个数据库

通过传递ContentValues 对象给insert() 方法插入数据到数据库

// Gets the data repository in write mode
SQLiteDatabase db = mDbHelper.getWritableDatabase();

// Create a new map of values, where column names are the keys
ContentValues values = new ContentValues();
values.put(FeedReaderContract.FeedEntry.COLUMN_NAME_ENTRY_ID, id);
values.put(FeedReaderContract.FeedEntry.COLUMN_NAME_TITLE, title);
values.put(FeedReaderContract.FeedEntry.COLUMN_NAME_CONTENT, content);

// Insert the new row, returning the primary key value of the new row
long newRowI
newRowId = db.insert(
         FeedReaderContract.FeedEntry.TABLE_NAME,
         FeedReaderContract.FeedEntry.COLUMN_NAME_NULLABLE,
         values);

insert()第一个参数是表名,第二个参数是列名,当ContentValudes为空时,能够插入NULL。如果使用null替代ContentValues对象(如这里的values),将不会插入一行.

从数据库中读取信息

使用query()方法传递您的选择标准和所需的列从数据库中读,该方法结合insert()和update()元素,列列表定义你想要获取的数据,而不是插入的数据。查询的结果以一个Cursor对象返回。


SQLiteDatabase db = mDbHelper.getReadableDatabase();

// Define a projection that specifies which columns from the database
// you will actually use after this query.
String[] projection = {
    FeedEntry._ID,
    FeedEntry.COLUMN_NAME_TITLE,
    FeedEntry.COLUMN_NAME_UPDATED,
    ...
    };

// How you want the results sorted in the resulting Cursor
String sortOrder =
    FeedEntry.COLUMN_NAME_UPDATED + " DESC";

Cursor c = db.query(
    FeedEntry.TABLE_NAME,  // The table to query
    projection,                               // The columns to return
    selection,                                // The columns for the WHERE clause
    selectionArgs,                            // The values for the WHERE clause
    null,                                     // don't group the rows
    null,                                     // don't filter by row groups
    sortOrder                                 // The sort order
    );

为查看cursor的行,在开始读取值之前,你必须调用Cursor move 方法之一。通常,您首先应该调用moveToFirst(), 该方法将“read position” 放置在结果第一项位置,对每一行,您可以调用Cursor get 方法,读取某列的值, 例如getString() 或getLong(). 每一个get 方法,您必须传入您想要列的位置索引,调用getColumnIndex() 或getColumnIndexOrThrow() 可以获取位置索引位置。例如:

cursor.moveToFirst();
long itemId = cursor.getLong(
    cursor.getColumnIndexOrThrow(FeedEntry._ID)
);
删除数据库信息

为删除表中的行,您需要提供确定行的选择准则。数据库API 提供创建选择准则,防止SQL injection 的机制,该机制将选择准则分成选择语句和选择参数,选择语句定义查找列,以及允许您组合列测试。参数值测试被绑定的语句,因为结果如正常SQL语句一样不被处理,不受SQL injection 的影响。


// Define 'where' part of query.
String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";
// Specify arguments in placeholder order.
String[] selectionArgs = { String.valueOf(rowId) };
// Issue SQL statement.
db.delete(table_name, selection, selectionArgs);

更新数据库信息

当您需要修改数据库值的子集,使用update()方法. 结合insert()方法的内容值语法和delete()方法的位置语法,更新表


SQLiteDatabase db = mDbHelper.getReadableDatabase();

// New value for one column
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_TITLE, title);

// Which row to update, based on the ID
String selection = FeedEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";
String[] selectionArgs = { String.valueOf(rowId) };

int count = db.update(
    FeedReaderDbHelper.FeedEntry.TABLE_NAME,
    values,
    selection,
    selectionArgs);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值