android SQLite数据库存储数据

简介:

简介

  SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。Android 集成了 SQLite 数据库 Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。

  对于熟悉 SQL 的开发人员来时,在 Android 开发中使用 SQLite 相当简单。但是,由于 JDBC 会消耗太多的系统资源,所以 JDBC 对于手机这种内存受限设备来说并不合适。因此,Android 提供了一些新的 API 来使用 SQLite 数据库,Android 开发中,程序员需要学使用这些 API。

  数据库存储在 data/< 项目文件夹 >/databases/ 下。 Android 开发中使用 SQLite 数据库 Activites 可以通过 Content Provider 或者 Service 访问一个数据库。

  创建数据库

  创建数据库只要自定义一个类继承SQLiteOpenHelper即可。在SQLiteOpenHelper 的子类,至少需要实现三个方法:

  1 构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通常是 Null),一个代表你正在使用的数据库模型版本的整数。

  2 onCreate()方法,它需要一个 SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据。

  3 onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。(Android中数据库升级使用SQLiteOpenHelper类onUpgrade方法说明)

  下面示例代码展示了如何继承 SQLiteOpenHelper 创建数据库:

public class DBHelper extends SQLiteOpenHelper {
// 数据库名称
public static final String DBNAME = "crius.db";
// 数据库版本
public static final int VERSION = 2;
public DBHelper(Context c, String dbName) {
super(c, DBNAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO 创建数据库后,创建表
db.execSQL("create table if not exists draftbox(pkid integer primary key autoincrement,formcode varchar(20),date datetime,summary varchar(100), context text, imagefolder varchar(50)) ");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO 更改数据库版本的操作
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
// TODO 每次成功打开数据库后首先被执行
}
}

  对数据库表进行操作

  接下来讨论具体如何插入数据、查询数据、删除数据等等。调用 getReadableDatabase() 或 getWriteableDatabase() 方法,你可以得到 SQLiteDatabase 实例,具体调用那个方法,取决于你是否需要改变数据库的内容。有两种方法可以对数据库表进行操作:使用execSQL方法执行SQL语句;使用insert、delete、update和query方法,把SQL语句的一部分作为参数。

  插入数据:

  使用SQLiteDatabase.insert()方法来插入数据:

public voidinsert(int formCode, String summary, String context, String folder) {
Log.i("SQLite", "----insert----");
ContentValues values = new ContentValues();
values.put("formcode", formCode);
values.put("date", (new TaskDate()).toString());
values.put("summary", summary);
values.put("context", context);
values.put("imagefolder", folder);
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
try {   db.insert("draftbox",null, values);db.setTransactionSuccessful();     } catch (Exception e) {
return ;
} finally {
db.endTransaction();
}
db.close();}

  使用SQLiteDatabase.execSQL()方法来插入数据:

public int insert(Person person) {     Log.i("SQLite", "----insert----");      SQLiteDatabase db = getWritableDatabase();     db.beginTransaction();     try {          db.execSQL("insert into " + "draftbox"                  + " values(?, ?, ?, ?)", new Object[] { person.formCode,                  person.summary, person.context, person.folder});          db.setTransactionSuccessful();     } catch (Exception e) {          return 0;     } finally {          db.endTransaction();     }     db.close();     return 1; }  

  删除数据:

  使用SQLiteDatabase.delete()方法来删除数据(删除所有数据db.delete(<表名>, null, null)):

public int delete(Person person) {
Log.e("SQLite", "----delete----");
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.beginTransaction();
try {
db.delete(Person.TABLENAME , "id"+ "=?", new String[] { person.id});
db.setTransactionSuccessful();
} catch (Exception e) {
return 0;
} finally {
db.endTransaction();
}
db.close();
return 1;
}

  使用SQLiteDatabase.execSQL()方法来删除数据:

public int delete(Person person) {
Log.e("SQLite", "----delete----");
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.beginTransaction();
try {
db.execSQL("delete from " + Person.TABLENAME + " where id = ?",
new Object[] { person.id });
db.setTransactionSuccessful();
} catch (Exception e) {
return 0;
} finally {
db.endTransaction();
}
db.close();
return 1;
}



 修改数据:

  使用SQLiteDatabase.update()方法来修改数据:

public int update(Person person) { 
     Log.e("SQLite", "----update----"); 
     ContentValues values = new ContentValues();
     values.put("formcode", person.formCode);
     values.put("summary", person.summary);
     values.put("context", person.context);
     values.put("imagefolder", person.folder);
     SQLiteDatabase db = dbHelper.getWritableDatabase(); 
     db.beginTransaction(); 
     try { 
         db.update(Person.TABLENAME, values , "id" + "=?",new String[] {person.id});
         db.setTransactionSuccessful(); 
     } catch (Exception e) { 
         return 0; 
     } finally { 
         db.endTransaction(); 
     } 
     db.close(); 
     return 1; 

  使用SQLiteDatabase.execSQL()方法来修改数据:

public int update(Person person) { 
     Log.e("SQLite", "----update----"); 
     SQLiteDatabase db = dbHelper.getWritableDatabase(); 
     db.beginTransaction(); 
     try { 
          db.execSQL("update " + Person.TABLENAME 
                   + " set formCode=?, summary=?, context=? where id=?", new Object[] { 
                   person.formCode,person.summary, person.context, person.id}); 
          db.setTransactionSuccessful(); 
     } catch (Exception e) { 
          return 0; 
     } finally { 
          db.endTransaction(); 
     } 
     db.close(); 
     return 1; 

  查询数据:

  使用SQLiteDatabase.rawQuery()方法来查询数据:

  Cursor c=db.rawQuery( "SELECT formCode,summary,context,imagefolder FROM draftbox WHERE id=? ", person.id);

  使用SQLiteDatabase.query()方法来查询数据:

/**

* @param table 表名
* @param columns 列名字符串数组
* @param selection 筛选条件
* @param selectionArgs 筛选条件参数数组
* @param groupBy 分组字段
* @param having 
* @param orderBy 排序字段
* @return Cursor对象
*/

public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy); Cursor c=db.query("draftbox" , columns, selection, selectionArgs,groupBy, having, orderBy);




不管你如何执行查询,都会返回一个 Cursor,这是 Android 的 SQLite 数据库游标,Cursor 是每行的集合。

  使用 moveToFirst() 定位第一行。

  你必须知道每一列的名称。

  你必须知道每一列的数据类型。

  Cursor 是一个随机的数据源。

  所有的数据都是通过下标取得。

  关于 Cursor 的重要方法:

  close()
关闭游标,释放资源
copyStringToBuffer(int columnIndex, CharArrayBuffer buffer)
在缓冲区中检索请求的列的文本,将将其存储
getColumnCount()
返回所有列的总数
getColumnIndex(String columnName)
返回指定列的名称,如果不存在返回-1
getColumnIndexOrThrow(String columnName)
从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
getColumnName(int columnIndex)
从给定的索引返回列名
getColumnNames()
返回一个字符串数组的列名
getCount()
返回Cursor 中的行数
moveToFirst()
移动光标到第一行
moveToLast()
移动光标到最后一行
moveToNext()
移动光标到下一行
moveToPosition(int position)
移动光标到一个绝对的位置
moveToPrevious()
移动光标到上一行

  现在让我们看看如何循环 Cursor 取出我们需要的数据:

Cursor result=db.rawQuery("SELECT pkid, date, context FROM draftbox",null);
result.moveToFirst(); 
while (!result.isAfterLast()) { 
     int id=result.getInt(0); 
     String date=result.getString(1); 
     //通过字段字取值
     String context=result.getString(result.getColumnIndex("context")); 
     result.moveToNext(); 
}
result.close(); 
 
  SQLite 数据库管理工具

  在 Android 中使用 SQLite 数据库管理工具 在其他数据库上作开发,一般都使用工具来检查和处理数据库的内容,而不是仅仅使用数据库的 API。

  使用 Android 模拟器,有两种可供选择的方法来管理数据库。

  首先,模拟器绑定了 sqlite3 控制台程序,可以使用 adb shell 命令来调用他。只要你进入了模拟器的 shell,在数据库的路径执行 sqlite3 命令就可以了。

  数据库文件一般存放在: /data/data/<项目文件夹>/databases/<数据库名>如果你喜欢使用更友好的工具,你可以把数据库拷贝到你的开发机上,使用 SQLite-aware 客户端来操作它。这样的话,你在一个数据库的拷贝上操作,如果你想要你的修改能反映到设备上,你需要把数据库备份回去。

  把数据库从设备上考出来,你可以使用 adb pull 命令(或者在 IDE 上做相应操作)。

  存储一个修改过的数据库到设备上,使用 adb push 命令。 一个最方便的 SQLite 客户端是 FireFox SQLite Manager 扩展,它可以跨所有平台使用。   



最新内容请见作者的GitHub页:http://qaseven.github.io/

   

目录
相关文章
|
28天前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
167 0
|
7天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
9 0
|
7天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
8 0
|
10天前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。
|
15天前
|
关系型数据库 MySQL 数据库连接
Python+SQLite数据库实现服务端高并发写入
Python中使用SQLite内存模式实现高并发写入:创建内存数据库连接,建立表格,通过多线程并发写入数据。虽然能避免数据竞争,但由于SQLite内存模式采用锁机制,可能在高并发时引发性能瓶颈。若需更高性能,可选择MySQL或PostgreSQL。
18 0
|
21天前
|
XML Java Android开发
Android每点击一次按钮就添加一条数据
Android每点击一次按钮就添加一条数据
22 1
|
1月前
|
关系型数据库 数据库 C++
嵌入式数据库sqlite3【基础篇】基本命令操作,小白一看就懂(C/C++)
嵌入式数据库sqlite3【基础篇】基本命令操作,小白一看就懂(C/C++)
|
1月前
|
SQL 存储 数据库连接
在Python中使用sqlite3进行数据持久化操作
在Python中使用sqlite3进行数据持久化操作
37 0
|
1月前
|
存储 SQL 数据库
django如何连接sqlite数据库?
django如何连接sqlite数据库?
41 0
|
1月前
|
存储 Android开发 C++
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
31 3