android数据存储之Sqlite
程序员文章站
2022-05-15 23:45:56
...
android数据存储之Sqlite
Sqlite是轻量级的嵌入式数据库,支持基本的sql语句,android系统集成了Sqlite数据库,所以在android应用程序中可以使用Sqlite数据库。
更多Sqlite学习可参见sqlite官网:http://www.sqlite.org/
在android移动开发中不是使用JDBC来操作数据库,因为JDBC会消耗太多系统资源,所以android提供了自己的一套API来使用Sqlite数据库。
(1)SQLiteOpenHelper(android.database.sqlite.SQLieOpenHelper),这是一个抽象类,我们可以继承这个类来使用它。它的构造方法如下:
SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version)
在该构造方法中:第一个参数:是android的context类对象,第二个参数:是数据库名称,第三个参数:游标的工厂类,一般设为null,第四个参数:是数据库版本,一般是正整数。
public void onCreate(SQLiteDatabase db)
该方法是数据库被创建时被调用,可以在该方法中完成数据库的初始化工作(如创建数据库表)。即是说在调用SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法时该方法会被调用,而且只是数据库创建时才被调用,如果数据库已经存在,那么就不会调用该方法。
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
可在该方法中完成数据库的更新操作。即是说当数据库的version改变时该方法会被调用。
SQLiteDatabase getReadableDatabase();
调用该方法可以获取可读的SQLiteDatabase对象。
SQLiteDatabase getWritableDatabase();
调用该方法可以获取可写的SQLiteDatabase对象。
(2)SQLiteDatabase(android.database.sqlite.SQLiteDatabase),这个类实现了很多关于操作Sqlite数据库的方法,如对数据库增、删、改、查等操作都可以在这个类中完成。
要获取SQLiteDatabase对象我们可以通过SQLiteOpenHelper构建。
execSQL(String sql);
调用这个方法可以非常方便的执行一些基本的sql语句来操作SQLite数据库。如增、删、改、等操作,该方法适用于不返回结果的sql语句操作。除了该方法外SQLiteDatabase还提供一些常用方法实现数据库的增、删、改、查等操作。
long insert(String tableName, String nullColumHack, ContentValues values);
调用该方法可以向数据库中插入数据,第一个参数是数据要插入的表名,第二参数是表示如果插入的数据每一列都为空的话,需要指定此行中某一列的名称,系统将此列设置为null,不至于出错,第三个参数是ContentValues类型的变量,该变量可以存储key-value格式的值,只是key只能是字符串类型的值代表列名,value只能是一些基本类型的值代表要插入的值。
int delete(String tableName, String whereClause, String[] whereArgs);
调用该方法可以删除数据库中的数据,第一个参数是要删除数据的表名,第二个参数是删除中的where条件,第三个参数是where条件中的条件值,即可以在第二个参数的where条件设下占位符,然后通过第三个参数来设置该占位符的值。
int update(String table, ContentValues values, String whereClause, String[] whereArgs);
可以调用该方法来修改数据库中的数据,方法中的参数同上。
Cursor query(String tableName, String[] colums, String seletion, String[] selectionArgs, String groupby, String having, String orderby);
可以通过该方法查取数据库的数据,第一个参数是要查取的表名,第二个参数是需要查取的列,第三个参数查去的条件相当于where条件,第四个参数是查取条件的值,第五个参数是group by,第六个参数是having,第七个参数是order by,还有其他两个query方法,比该方法还要多两个参数,一个是distinct去重参数,一个是limit参数。
Cursor rawQuery(String sql, String[] selectionArgs);
通过该方法可以执行sql语句来查去数据,第一个参数是sql语句,第二参数是指定sql中的占位符的值。
(3)Cursor(android.database.Cursor)是SQLiteDatabase的查取数据库后返回的一个结果对象,它代表数据集的游标。我们可以遍历游标的数据集获取查取的数据。
上面是android提供的几个操作数据库对象的常用方法,如果想了解更多可以查看android自身的API.
下面我们可以通过一个列子来叙述android中怎样对Sqlite数据库进行操作。
实现如下:
MyDatabase:数据库结构类,存储数据库表结构信息。
MySqliteDatabase:sqlite数据库操作类,包含有实现SQLiteOpenHelper的内部类。
Activity3:activity类。
MySqliteDatabase实现如下:
Activity3实现如下
运行程序如下:
[img]http://dl.iteye.com/upload/attachment/0083/5723/a8b65cd1-9f89-3a41-8dc7-2faf25ffdfab.png[/img]
第一次运行程序的时候后台输出:create table:user
在输入框输入“xmong”,点击insert按钮,后台输出:insert data count:1
点击query按钮,后台输出:_id:1,name:xmong
在输入框中输入“1,xzm”,点击update按钮,清空输入框,在点击query按钮,后台输出:_id:1,name:xzm
在输入看输入“xzm”,点击delete按钮,在点击query按钮,后台无数据输出,xzm数据已经被删除。
上面演示过程表明该程序对sqlite数据库实现了一些基本增,删,改,查操作。
当然除了后台输出结果可以表明操作书库成功外,我们也可以同过android自带的工具adb来查看Sqlite数据库。
当我们第一次运行程序后,可以通过adb shell或者DDMS的File Explor查看/data/data/<包名>/databases目录下有一个db_test文件,该文件就是db_test数据库存储数据的文件。
运行cmd:
在adb shell中我们还可以通过命令来操作数据库:
源代码下载:[url]http://xmong.iteye.com/blog/1852204[/url]
Sqlite是轻量级的嵌入式数据库,支持基本的sql语句,android系统集成了Sqlite数据库,所以在android应用程序中可以使用Sqlite数据库。
更多Sqlite学习可参见sqlite官网:http://www.sqlite.org/
在android移动开发中不是使用JDBC来操作数据库,因为JDBC会消耗太多系统资源,所以android提供了自己的一套API来使用Sqlite数据库。
(1)SQLiteOpenHelper(android.database.sqlite.SQLieOpenHelper),这是一个抽象类,我们可以继承这个类来使用它。它的构造方法如下:
SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version)
在该构造方法中:第一个参数:是android的context类对象,第二个参数:是数据库名称,第三个参数:游标的工厂类,一般设为null,第四个参数:是数据库版本,一般是正整数。
public void onCreate(SQLiteDatabase db)
该方法是数据库被创建时被调用,可以在该方法中完成数据库的初始化工作(如创建数据库表)。即是说在调用SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法时该方法会被调用,而且只是数据库创建时才被调用,如果数据库已经存在,那么就不会调用该方法。
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
可在该方法中完成数据库的更新操作。即是说当数据库的version改变时该方法会被调用。
SQLiteDatabase getReadableDatabase();
调用该方法可以获取可读的SQLiteDatabase对象。
SQLiteDatabase getWritableDatabase();
调用该方法可以获取可写的SQLiteDatabase对象。
(2)SQLiteDatabase(android.database.sqlite.SQLiteDatabase),这个类实现了很多关于操作Sqlite数据库的方法,如对数据库增、删、改、查等操作都可以在这个类中完成。
要获取SQLiteDatabase对象我们可以通过SQLiteOpenHelper构建。
execSQL(String sql);
调用这个方法可以非常方便的执行一些基本的sql语句来操作SQLite数据库。如增、删、改、等操作,该方法适用于不返回结果的sql语句操作。除了该方法外SQLiteDatabase还提供一些常用方法实现数据库的增、删、改、查等操作。
long insert(String tableName, String nullColumHack, ContentValues values);
调用该方法可以向数据库中插入数据,第一个参数是数据要插入的表名,第二参数是表示如果插入的数据每一列都为空的话,需要指定此行中某一列的名称,系统将此列设置为null,不至于出错,第三个参数是ContentValues类型的变量,该变量可以存储key-value格式的值,只是key只能是字符串类型的值代表列名,value只能是一些基本类型的值代表要插入的值。
int delete(String tableName, String whereClause, String[] whereArgs);
调用该方法可以删除数据库中的数据,第一个参数是要删除数据的表名,第二个参数是删除中的where条件,第三个参数是where条件中的条件值,即可以在第二个参数的where条件设下占位符,然后通过第三个参数来设置该占位符的值。
int update(String table, ContentValues values, String whereClause, String[] whereArgs);
可以调用该方法来修改数据库中的数据,方法中的参数同上。
Cursor query(String tableName, String[] colums, String seletion, String[] selectionArgs, String groupby, String having, String orderby);
可以通过该方法查取数据库的数据,第一个参数是要查取的表名,第二个参数是需要查取的列,第三个参数查去的条件相当于where条件,第四个参数是查取条件的值,第五个参数是group by,第六个参数是having,第七个参数是order by,还有其他两个query方法,比该方法还要多两个参数,一个是distinct去重参数,一个是limit参数。
Cursor rawQuery(String sql, String[] selectionArgs);
通过该方法可以执行sql语句来查去数据,第一个参数是sql语句,第二参数是指定sql中的占位符的值。
(3)Cursor(android.database.Cursor)是SQLiteDatabase的查取数据库后返回的一个结果对象,它代表数据集的游标。我们可以遍历游标的数据集获取查取的数据。
c.move(int offset); //以当前位置为参考,移动到指定行
c.moveToFirst(); //移动到第一行
c.moveToLast(); //移动到最后一行
c.moveToPosition(int position); //移动到指定行
c.moveToPrevious(); //移动到前一行
c.moveToNext(); //移动到下一行
c.isFirst(); //是否指向第一条
c.isLast(); //是否指向最后一条
c.isBeforeFirst(); //是否指向第一条之前
c.isAfterLast(); //是否指向最后一条之后
c.isNull(int columnIndex); //指定列是否为空(列基数为0)
c.isClosed(); //游标是否已关闭
c.getCount(); //总数据项数
c.getPosition(); //返回当前游标所指向的行数
c.getColumnIndex(String columnName);//返回某列名对应的列索引值
c.getString(int columnIndex); //返回当前行指定列的值
上面是android提供的几个操作数据库对象的常用方法,如果想了解更多可以查看android自身的API.
下面我们可以通过一个列子来叙述android中怎样对Sqlite数据库进行操作。
实现如下:
MyDatabase:数据库结构类,存储数据库表结构信息。
MySqliteDatabase:sqlite数据库操作类,包含有实现SQLiteOpenHelper的内部类。
Activity3:activity类。
package com.sqlite;
import android.provider.BaseColumns;
/**
* 常量类表示数据库表结构
* @author xmong
*/
public class MyDatabase {
//数据库名
public final static String DB_NAME = "db_test";
//数据库版本
public final static int DB_VERSION = 1;
/**
* User表结构,
* 实现BaseColumns常量接口,包含两个默认属性_ID和_COUNT
*/
public class User implements BaseColumns{
public final static String TAB_NAME = "user"; //表名
public final static String COL_NAME = "name"; //用户名
}
}
MySqliteDatabase实现如下:
package com.sqlite;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
/**
* @author xmong
*/
public class MySqliteDatabase{
//sqlite数据库对象
private SQLiteDatabase sqliteDatabase = null;
/**
* 数据库帮助类,继承SQLiteOpenHelper
*/
static class DatabaseHelper extends SQLiteOpenHelper{
/**
* 构造数据库对象
* @param context context对象
* @param name 数据库名
* @param factory 可选游标工厂,通常可是null
* @param version 当前数据库版本
*/
public DatabaseHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
//根据context构建数据库帮助对象
public DatabaseHelper(Context context) {
//调用自身构造方法
this(context, MyDatabase.DB_NAME, null, MyDatabase.DB_VERSION);
}
/**
* 该函数是在第一次创建数据库的时候执行,即第一次调用SQLiteOpenHelper对象的
* getWritableDatabase()或getReadableDatabase()方法时才执行该方法
* 可用于执行数据库初始化工作
*/
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("create table:"+ MyDatabase.User.TAB_NAME);
//创建表sql语句
String sql = "create table "+MyDatabase.User.TAB_NAME
+" ("+MyDatabase.User._ID+" integer primary key autoincrement,"
+MyDatabase.User.COL_NAME+" varchar(20))";
//执行sql语句
db.execSQL(sql);
}
/**
* 第一个参数是SQLiteDatabase对象,第二个参数是旧的数据库版本,第三个参数是新的数据库版本号,
* 可用于执行数据库的升级,将一个数据库从旧版本转变到新版本执行相应的操作
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//可执行一些升级或修改数据库操作
System.out.println("update database");
}
}
/**
* 根据context构建sqlite数据库对象
* @param context
*/
public MySqliteDatabase(Context context) {
/**
* 通过调用数据库帮助对象SQLiteOpenHelper的getWritableDatabase()方法
* 获取一个可读写的数据库对象sqliteDatabase
*/
sqliteDatabase = (new DatabaseHelper(context)).getWritableDatabase();
}
/**
* 插入数据库记录
* @param name 用户名称
* @return 返回插入的记录条数
*/
public long insertData(String name){
//通过ContentValues来保存表字段对应的数据值
ContentValues cv = new ContentValues();
cv.put(MyDatabase.User.COL_NAME, name);
/**
* 第一个参数:数据库表名,
* 第二个参数:插入中值都为空则指定某一列的值null
* 第三个参数:需插入数据
*/
return sqliteDatabase.insert(MyDatabase.User.TAB_NAME, null, cv);
}
/**
* 查取所有表记录数据
* @return 返回数据游标
*/
public Cursor queryData(){
return sqliteDatabase.query(MyDatabase.User.TAB_NAME,
new String[]{MyDatabase.User._ID, MyDatabase.User.COL_NAME},
null, null, null, null, null);
}
/**
* 根据用户名查取数据
* @param name 用户名
* @return 返回数据游标
*/
public Cursor queryData(String name){
return sqliteDatabase.query(MyDatabase.User.TAB_NAME,
new String[]{MyDatabase.User._ID, MyDatabase.User.COL_NAME},
MyDatabase.User.COL_NAME+"=?", new String[]{name}, null, null, null);
}
/**
* 根据用户id修改用户名
* @param id 用户id
* @param name 用户名
* @return 返回修改的记录数
*/
public int updateData(int id, String name){
ContentValues cv = new ContentValues();
cv.put(MyDatabase.User.COL_NAME, name);
return sqliteDatabase.update(MyDatabase.User.TAB_NAME, cv, MyDatabase.User._ID+"=?", new String[]{id+""});
}
/**
* 根据用户名删除数据
* @param name 用户名
* @return 返回删除的记录数
*/
public int deleteData(String name){
return sqliteDatabase.delete(MyDatabase.User.TAB_NAME, MyDatabase.User.COL_NAME+"=?", new String[]{name});
}
/**
* 删除数据库
* @param context
*/
public void deleteDatabase(Context context){
System.out.println("delete database:"+MyDatabase.DB_NAME);
context.deleteDatabase(MyDatabase.DB_NAME);
}
/**
* 关闭数据库,数据库操作完后需要释放资源
*/
public void close() {
sqliteDatabase.close();
}
}
Activity3实现如下
package com.sqlite;
import com.example.R;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.app.Activity;
import android.database.Cursor;
public class Activity3 extends Activity {
private EditText editText; //输入框
private Button insertBtn; //插入按钮
private Button queryBtn; //查询按钮
private Button updateBtn; //更新按钮
private Button deleteBtn; //删除按钮
//数据库对象
private MySqliteDatabase mySqliteDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity3);
//从视图中获取控件对象
editText = (EditText)findViewById(R.id.text);
insertBtn = (Button)findViewById(R.id.insert);
queryBtn = (Button)findViewById(R.id.query);
updateBtn = (Button)findViewById(R.id.update);
deleteBtn = (Button)findViewById(R.id.delete);
//为按钮对象设置点击事件
insertBtn.setOnClickListener(insertBtnClick);
queryBtn.setOnClickListener(queryBtnClick);
updateBtn.setOnClickListener(updateBtnClick);
deleteBtn.setOnClickListener(deleteBtnClick);
//构建sqlite数据库对象
mySqliteDatabase = new MySqliteDatabase(Activity3.this);
//mySqliteDatabase.deleteDatabase(Activity3.this);//删除数据库
}
//插入按钮点击事件监听器
OnClickListener insertBtnClick = new OnClickListener() {
@Override
public void onClick(View v) {
//获取文本输入的用户名,将其插入数据库
String text = editText.getText().toString().trim();
long i = mySqliteDatabase.insertData(text);
System.out.println("insert data count:"+i);
}
};
//查取按钮点击事件监听器
OnClickListener queryBtnClick = new OnClickListener() {
@Override
public void onClick(View v) {
String text = editText.getText().toString().trim();
//根据输入框文本查取数据库数据,文本问空默认查取所有数据
Cursor cursor = null;
if ("".equals(text)) {
cursor = mySqliteDatabase.queryData();
}else{
cursor = mySqliteDatabase.queryData(text);
}
//遍历游标输出查取的数据
for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){
String str = MyDatabase.User._ID+":"+cursor.getInt(cursor.getColumnIndex(MyDatabase.User._ID))
+","+MyDatabase.User.COL_NAME+":"+cursor.getString(cursor.getColumnIndex(MyDatabase.User.COL_NAME));
System.out.println(str);
}
}
};
//修改按钮点击事件监听器
OnClickListener updateBtnClick = new OnClickListener() {
@Override
public void onClick(View v) {
//根据输入文本修改用户数据,id和用户名用逗号分隔,根据id号修改用户名
String text = editText.getText().toString().trim();
String[] arr = text.split(",");
mySqliteDatabase.updateData(Integer.parseInt(arr[0]), arr[1]);
}
};
//删除按钮点击事件监听器
OnClickListener deleteBtnClick = new OnClickListener() {
@Override
public void onClick(View v) {
//根据输入的用户名输出数据
String text = editText.getText().toString().trim();
mySqliteDatabase.deleteData(text);
}
};
//按键事件
public boolean onKeyUp(int keyCode, KeyEvent event) {
//当按键为回退键是结束这个activity
if (keyCode == KeyEvent.KEYCODE_BACK) {
//关闭数据库,释放资源
mySqliteDatabase.close();
Activity3.this.finish();
}
return true;
};
}
运行程序如下:
[img]http://dl.iteye.com/upload/attachment/0083/5723/a8b65cd1-9f89-3a41-8dc7-2faf25ffdfab.png[/img]
第一次运行程序的时候后台输出:create table:user
在输入框输入“xmong”,点击insert按钮,后台输出:insert data count:1
点击query按钮,后台输出:_id:1,name:xmong
在输入框中输入“1,xzm”,点击update按钮,清空输入框,在点击query按钮,后台输出:_id:1,name:xzm
在输入看输入“xzm”,点击delete按钮,在点击query按钮,后台无数据输出,xzm数据已经被删除。
上面演示过程表明该程序对sqlite数据库实现了一些基本增,删,改,查操作。
当然除了后台输出结果可以表明操作书库成功外,我们也可以同过android自带的工具adb来查看Sqlite数据库。
当我们第一次运行程序后,可以通过adb shell或者DDMS的File Explor查看/data/data/<包名>/databases目录下有一个db_test文件,该文件就是db_test数据库存储数据的文件。
运行cmd:
>adb shell
#cd /data/data/com.example/databases
#ls
db_test
在adb shell中我们还可以通过命令来操作数据库:
#sqlite3 db_test
sqlite>.schema
CREATE TABLE android_metadata (locale TEXT);
CREATE TABLE user(id integer primary key autoincrement, name varchar(20));
sqlite>select * from user
1|xmong
sqlite>.quit
源代码下载:[url]http://xmong.iteye.com/blog/1852204[/url]
上一篇: 城市梦想,战争与未来世界。
下一篇: 特大新闻,汪峰上头版头条了。