Android学习小结(四)——数据持久SQLite
2011-04-17 11:58 onm 阅读(232) 评论(0) 编辑 收藏 举报
Android提供了几种方法帮助持久化Android应用的数据。
包括Shared Preferences, Internal Storage, External Storage, SQLite Databases。
对于Internal或者External Storage就是读写文件,将数据持久话到File上。(当然其实所有的持久话方式,最终都是将数据存储到文件上,只是文件存储数据的方式不同。)
Shared Preferences可以存储原生的数据类型到key-value对中,最终到存储上的形式是一个xml文件。
SQLite Databases是将数据结构化的持久话到数据数据库中。SQLite是
然后实例话该扩展类,通过调用getWritableDatabase()和getReadableDatabase()方法获取可写的数据库和只读的数据库,这个返回的类型是前文提到的SQLiteDatabase。然后我们就可以通过SQLiteDatabase的实例执行SQL语句,除了用于SELECT的Query的语句调用rawQuery()外,其它通过execSQL()执行SQL语句。对于Query,返回为Cursor类型的游标,指向entry的第一条记录。
带参数传递的execSQL方法示例。
带参数传递的rawQuery方法示例。
以上都是使用了原始的SQL语句方式操作数据库,Android提供了相应的操作数据库的封装,比如SQLiteQueryBuilder类,SQLiteDatabase类也提供了相应的封装方法,具体课参见类文档。
Android提供了一个通过远程Shell访问SQLite数据库的方法。就是先进adb shell,然后通过sqlite3 /data/data/<packagename>/databases/<databasename>命令,就可以对数据库进行操作了。
其实关于SQLite Databases这种持久话方式,针对于Android并无多少过多可讲。主要是要了解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上的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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); } } |
1 2 3 | final Object[] args = new Object[ 1 ]; args[ 0 ] = id; db.execSQL( "DELETE FROM tablename WHERE id = ?" , args); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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()方法释放资源。 |
- SQLite3数据类型:http://www.sqlite.org/datatype3.html
- SQLite的SQL语句:http://www.sqlite.org/lang.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述