您的位置:首页 > 移动开发 > Android开发

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

2011-04-17 11:58 302 查看
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。最后放上两个常用的链接。

SQLite3数据类型:http://www.sqlite.org/datatype3.html

SQLite的SQL语句:http://www.sqlite.org/lang.html

标注:这篇笔记自己思考的空间很少,主要是对SQLite相关文档进行了一点整理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: