代码改变世界

Android学习小结(四)——数据持久SQLite

2011-04-17 11:58  onm  阅读(227)  评论(0编辑  收藏  举报
Android提供了几种方法帮助持久化Android应用的数据。 包括Shared Preferences, Internal Storage, External Storage, SQLite Databases。 对于Internal或者External Storage就是读写文件,将数据持久话到File上。(当然其实所有的持久话方式,最终都是将数据存储到文件上,只是文件存储数据的方式不同。) Shared Preferences可以存储原生的数据类型到key-value对中,最终到存储上的形式是一个xml文件。 SQLite Databases是将数据结构化的持久话到数据数据库中。SQLite是
SQLite is an embedded SQL database engine. Unlike most other SQL databases, SQLite does not have a separate server process. SQLite reads and writes directly to ordinary disk files. A complete SQL database with multiple tables, indices, triggers, and views, is contained in a single disk file. The database file format is cross-platform - you can freely copy a database between 32-bit and 64-bit systems or between big-endian and little-endian architectures. These features make SQLite a popular choice as an Application File Format. Think of SQLite not as a replacement for Oracle but as a replacement for fopen()
Android提供了android.database.sqlite包,这个包包含了SQLite数据库的一些辅助类。最主要的是SQLiteDatabase,这个类暴露了一些管理查询数据的方法。官方还推荐继承SQLiteOpenHelper类然后覆写onCreate方法,来创建或者升级数据库。 这里是一个Dev Guide上的例子:
public class DictionaryOpenHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 2;
    private static final String DICTIONARY_TABLE_NAME = "dictionary";
    private static final String DICTIONARY_TABLE_CREATE =
                "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
                KEY_WORD + " TEXT, " +
                KEY_DEFINITION + " TEXT);";

    DictionaryOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DICTIONARY_TABLE_CREATE);
    }
}
然后实例话该扩展类,通过调用getWritableDatabase()和getReadableDatabase()方法获取可写的数据库和只读的数据库,这个返回的类型是前文提到的SQLiteDatabase。然后我们就可以通过SQLiteDatabase的实例执行SQL语句,除了用于SELECT的Query的语句调用rawQuery()外,其它通过execSQL()执行SQL语句。对于Query,返回为Cursor类型的游标,指向entry的第一条记录。 带参数传递的execSQL方法示例。
final Object[] args = new Object[1];
args[0] = id;
db.execSQL("DELETE FROM tablename WHERE id = ?", args);
带参数传递的rawQuery方法示例。
final Object[] args = new Object[1];
args[0] = id;
db.execSQL("DELETE FROM tablename WHERE id = ?", args);

带参数传递的rawQuery方法示例。
final String[] args = new String[1];
args[0] = id;
Cursor cursor = db.rawQuery("SELECT * FROM tablename WHERE id = ?", args);
int total = cursor.getCount();
cursor.moveToFirst();
for (int i = 0; i < total; i++) {
	id = cursor.getString(COLUMN_ID);	// COLUMN_ID和COLUMN_TITLE为自定义的表的列序号,与创建表时的序号对应。
	title = cursor.getString(COLUMN_TITLE);
	cursor.moveToNext();
}
cursor.close();		// 注意对于Query,必须在不在需要资源时调用close()方法释放资源。
以上都是使用了原始的SQL语句方式操作数据库,Android提供了相应的操作数据库的封装,比如SQLiteQueryBuilder类,SQLiteDatabase类也提供了相应的封装方法,具体课参见类文档。 Android提供了一个通过远程Shell访问SQLite数据库的方法。就是先进adb shell,然后通过sqlite3 /data/data/<packagename>/databases/<databasename>命令,就可以对数据库进行操作了。 其实关于SQLite Databases这种持久话方式,针对于Android并无多少过多可讲。主要是要了解SQLite。最后放上两个常用的链接。
  1. SQLite3数据类型:http://www.sqlite.org/datatype3.html
  2. SQLite的SQL语句:http://www.sqlite.org/lang.html
标注:这篇笔记自己思考的空间很少,主要是对SQLite相关文档进行了一点整理。