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。最后放上两个常用的链接。
- SQLite3数据类型:http://www.sqlite.org/datatype3.html
- SQLite的SQL语句:http://www.sqlite.org/lang.html