Android数据存储之SQLite数据库存储
Android中每一个数据库对创建它的应用程序包套件来说都是私有的,默认情况下其他应用程序无法直接访问此私有数据库。所有的数据库文件存放在手机中的/data/data/package_name/databases路径下,以下是常用的与数据库相关的函数:
返回值 |
函数 |
备注 |
static SQLiteDatabase |
create(SQLiteDatabase.CursorFactory factory) |
创建一个数据库 factory:可选的数据库游标工厂类,当查询(query)被提交时,该对象会被调用来实例化一个游标。 |
static SQLiteDatabase |
openDatabase(String path,SQLiteDatabase.CursorFactory factory,int flags) |
根据提供的模式打开一个数据库 path:打开或创建的数据库文件 factory:可选的数据库游标工厂类,当查询(query)被提交时,该对象会被调用来实例化一个游标。默认为null。 flags:控制数据库的访问模式。主要有以下几种模式: l OPEN_READWRITE l OPEN_READONLY l CREATE_IF_NECESSARY l NO_LOCALIZED_COLLATORS |
static SQLiteDatabase |
openOrCreateDatabase(File file, SQLiteDatabase.CursorFactory factory) |
等同于openDatabase(file.getPath(), factory, CREATE_IF_NECESSARY) |
static SQLiteDatabase |
openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory) |
等同于openDatabase(path,factory, CREATE_IF_NECESSARY) |
void |
close() |
关闭数据库 |
boolean |
deleteDatabase(String name) |
删除指定的数据库 name:要关闭的数据库的名字 |
示例代码如下:
//创建数据库 SQLiteDatabase mydataBase=SQLiteDatabase.create(new CursorFactory(){ //工厂类,一个可选工厂类,当查询时调用来实例化一个游标 @Override public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) { // TODO Auto-generated method stub return null; } }); //创建或打开数据库 SQLiteDatabase myDataBase=this.openOrCreateDatabase("myDataBase.db", MODE_PRIVATE, new CursorFactory(){ //创建新的数据库,名称myDatabase,模式MODE_PRIVATE,可选的游标工厂类 @Override public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) { // TODO Auto-generated method stub return null; } }); SQLiteDatabase myDataBase=this.openOrCreateDatabase("myDataBase.db",MODE_PRIVATE,null); //关闭数据库 myDataBase.close(); //删除指定名称的数据库 this.deleteDatabase(“myDatabase.db”); |
在对数据库中的表进行相关操作时,可以使用非查询的execSQL(String sql)来执行。示例代码如下:
String CREATE_TABLE = “create table table1 (_id integer primary key autoincrement,number integer,data text)”; //创建表 myDataBase.execSQL(CREATE_TABLE); |
Android提供了非SQL指令的对数据表进行操作的方法,以下表格是一些常用方法:
返回值 |
函数 |
备注 |
long |
insert(String table, String nullColumnHack, ContentValues values) |
向表中插入一条数据 table:想要插入数据的表名 nullColumnHack:SQL不允许插入空行,初始化值为空时,这一列将会被显示地赋一个null值 values:要插入的值,具体解释见表格后的解释 |
int |
delete(String table, String whereClause, String[] whereArgs) |
从表中删除一行数据 table:想要删除数据的表名 whereClause:可选的where子句,如果其值为null,将会删除所有的行。 whereArgs:当在whereClause中包含”?”时,如果whereArgs的值不为null,则这个数组中的值将依次替换whereClause中出现的”?” |
Cursor |
query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) |
查询数据表 table:要查询数据的表名 columns:要返回的列的列名数组 selection:可选的where子句 ,如果其值为null,将会返回所有的行 selectionArgs:当在selection中包含”?”时,如果selectionArgs的值不为null,则这个数组中的值将依次替换selection中出现的”?” groupBy:可选的group by子句,如果其值为null,将不会对行进行分组 having:可选的having子句,如果其值为null,将会包含所有的分组 orderBy:可选的order by子句,如果其值为null,将会使用默认的排序规则 limit:可选的limit子句,如果其值为null,将不会包含limit子句 关于返回值类型Cursor将在表格后面进行解释 |
int |
update(String table, ContentValues values, String whereClause, String[] whereArgs) |
修改表中的数据 table:想要修改数据的表名 values:要更新的值,具体解释见表格后的解释 whereClause:可选的where子句,如果其值为null,将会修改所有的行。 whereArgs:当在whereClause中包含”?”时,如果whereArgs的值不为null,则这个数组中的值将依次替换whereClause中出现的”?” |
ContentValues主要是存放表中的数据段,以及其对应的值,与Hashtable一样采用名值对的形式存储,但是它存储的名值对中,名是一个String类型,值是基本数据类型。其使用示例如下:
ContentValues args = new ContentValues(); args.put(KEY_TITLE, title); args.put(KEY_BODY, body); myDataBase.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null); |
Android采用游标对从数据库中查询出来的结果进行随机的读写访问,在查询数据库后,将结果返回给游标(即android.database.Cursor),这是查询结果的记录集,示意图如下:
_id |
someNumber |
|
1 |
8 |
|
2 |
10 |
|
3 |
2 |
Cursor类常见的方法如下:
返回值 |
函数 |
备注 |
boolean |
move(int offset) |
以当前位置为参考,将Cursor移动指定数目的位置(相对位置) |
boolean |
moveToPosition(int position) |
将Cursor移动到指定位置(绝对位置) |
boolean |
moveToNext() |
将Cursor向前移动一个位置 |
boolean |
moveToLast() |
将Cursor向后移动一个位置 |
boolean |
moveToFirst() |
将Cursor移动到第一行 |
boolean |
isBeforeFirst() |
返回Cursor是否指向第一项数据之前 |
boolean |
isAfterLast() |
返回Cursor是否指向最后一项数据之后 |
boolean |
isClosed() |
返回Cursor是否关闭 |
boolean |
isFirst() |
返回Cursor是否指向第一项数据 |
boolean |
isLast() |
返回Cursor是否指向最后一项数据 |
boolean |
isNull(int columnIndex) |
返回指定位置的值是否为null |
int |
getCount() |
返回总的项目总数 |
int |
getInt(int columnIndex) |
返回指定列中的数据的int型表示 |
int |
getColumnIndex(String columnName) |
按给定的列的名字返回列的索引值,如果不存在则返回 -1 |
要创建一个Cursor(游标),必须执行一个查询,通过SQL使用rawQuery()方法或是更精心的query()方法,而不能使用execSQL(String sql)方法。以下为Cursor的使用示例:
Cursor cur=myDataBase.rawQuery("select * from test", null); if(cur!=null){//游标不为空 //返回给定名称的列的基于0开始的index,如果该属性列不存在则返回-1 //通过它们的index来检索属性值 int numColumn=cur.getColumnIndex("someNumber"); if(cur.moveToFirst()){ //cur.moveToFirst()让游标指向第一行,如果游标指向第一行,则返回true do { int num=cur.getInt(numColumn);//获得当前行该属性的值 /*Cursor提供了不同的方法来回索不同的数据类型,例如getInt(int index)/getString(int index)等等*/ /*做一些事情*/ } while (cur.moveToNext()); /*游标移动到下一行,如果游标已经到达结果集中的最后,即没有行可以移动时,则返回false*/ //其他可能移动的是 moveToPrevious() 和moveToFirst()方法 } } |
在实际使用的时候,通常都要封装一个继承SQLiteOpenHelper类的数据库操作类。SQLiteOpenHelper类是一个抽象的辅助类,主要用来生成一个数据库并对数据库的版本进行管理,在SQLiteOpenHelper类的构造方法中分别传入Context、数据库名称,CursorFactory(一般传入null,否则为默认数据库),数据库版本号(不能为负数)。在SQLiteOpenHelper中首先执行的是onCreate方法(当数据库第一次创建时),一般在这个方法里生成数据表。要注意的是,在构造函数时并没有真正创建数据库,而是在调用getWriteableDatabase()或者getReadableDatabase()方法的时候系统才会真正创建数据库,如果当时系统中不存在这个数据库,系统会自动生成一个数据库,然后返回SQLiteDatabase对象。在继承这个类的时候,要实现里面的3个方法,其中前两个方法是必须重写的。见如下表格:
返回值 |
函数 |
备注 |
public void |
onCreate(SQLiteDatabase db) |
在数据库第一次生成时会调用这个方法,一般我们在这个方法里生成数据表 |
public void |
onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) |
当数据库需要升级时,系统会自动调用这个方法,一般我们在这个方法里删除数据表,并建立新的数据表,并根据实际需求做其他的操作 |
public void |
onOpen(SQLiteDatabase db) |
这是打开数据库时的回调函数,一般不会用到 |
以下示例代码详细给出一封装好的数据库操作类:
public class MyDbHelper {
<!--CRLF-->
public static final String KEY_TITLE = "title"; //数据表字段
<!--CRLF-->
public static final String KEY_BODY = "body"; //数据表字段
<!--CRLF-->
public static final String KEY_ROWID = "_id"; //数据表字段
<!--CRLF--> <!--CRLF-->
private DatabaseHelper mDbHelper; //SQLiteOpenHelper实例对象
<!--CRLF-->
private SQLiteDatabase mDb; //数据库实例对象
<!--CRLF-->
<!--CRLF-->
//数据表创建语句
<!--CRLF-->
private static final String DATABASE_CREATE = "create table notes (_id integer primary key autoincrement, "
<!--CRLF-->
+ "title text not null, body text not null);";
<!--CRLF--> <!--CRLF-->
private static final String DATABASE_NAME = "data"; //数据库名
<!--CRLF-->
private static final String DATABASE_TABLE = "notes"; //数据库表名
<!--CRLF-->
private static final int DATABASE_VERSION = 2; //数据库版本号
<!--CRLF--> <!--CRLF-->
private final Context mCtx; //上下文实例
<!--CRLF--> <!--CRLF-->
private static class DatabaseHelper extends SQLiteOpenHelper { //数据库辅助类
<!--CRLF-->
DatabaseHelper(Context context) {
<!--CRLF-->
super(context, DATABASE_NAME, null, DATABASE_VERSION);
<!--CRLF-->
}
<!--CRLF-->
@Override
<!--CRLF-->
public void onCreate(SQLiteDatabase db) {
<!--CRLF-->
db.execSQL(DATABASE_CREATE);
<!--CRLF-->
}
<!--CRLF-->
@Override
<!--CRLF-->
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
<!--CRLF-->
db.execSQL("DROP TABLE IF EXISTS notes");
<!--CRLF-->
onCreate(db);
<!--CRLF-->
}
<!--CRLF-->
}
<!--CRLF--> <!--CRLF-->
/**
<!--CRLF-->
* Constructor - takes the context to allow the database to be opened/created
<!--CRLF-->
*
<!--CRLF-->
* @param ctx the Context within which to work
<!--CRLF-->
*/
<!--CRLF-->
public MyDbHelper(Context ctx) {
<!--CRLF-->
this.mCtx = ctx;
<!--CRLF-->
}
<!--CRLF--> <!--CRLF-->
/**
<!--CRLF-->
* Open the notes database. If it cannot be opened, try to create a new instance of the database.
<!--CRLF-->
* If it cannot be created, throw an exception to signal the failure
<!--CRLF-->
*
<!--CRLF-->
* @return this (self reference, allowing this to be chained in an initialization call)
<!--CRLF-->
* @throws SQLException if the database could be neither opened or created
<!--CRLF-->
*/
<!--CRLF-->
public MyDbHelper open() throws SQLException {
<!--CRLF-->
mDbHelper = new DatabaseHelper(mCtx);
<!--CRLF-->
mDb = mDbHelper.getWritableDatabase();
<!--CRLF-->
return this;
<!--CRLF-->
}
<!--CRLF-->
<!--CRLF-->
public void close() {
<!--CRLF-->
mDbHelper.close();
<!--CRLF-->
}
<!--CRLF--> <!--CRLF--> <!--CRLF-->
/**
<!--CRLF-->
* Create a new note using the title and body provided. If the note is successfully created
<!--CRLF-->
* return the new rowId for that note, otherwise return a -1 to indicate failure.
<!--CRLF-->
*
<!--CRLF-->
* @param title the title of the note
<!--CRLF-->
* @param body the body of the note
<!--CRLF-->
* @return rowId or -1 if failed
<!--CRLF-->
*/
<!--CRLF-->
public long createNote(String title, String body) {
<!--CRLF-->
ContentValues initialValues = new ContentValues();
<!--CRLF-->
initialValues.put(KEY_TITLE, title);
<!--CRLF-->
initialValues.put(KEY_BODY, body);
<!--CRLF-->
return mDb.insert(DATABASE_TABLE, null, initialValues);
<!--CRLF-->
}
<!--CRLF--> <!--CRLF-->
/**
<!--CRLF-->
* Delete the note with the given rowId
<!--CRLF-->
*
<!--CRLF-->
* @param rowId id of note to delete
<!--CRLF-->
* @return true if deleted, false otherwise
<!--CRLF-->
*/
<!--CRLF-->
public boolean deleteNote(long rowId) {
<!--CRLF-->
return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
<!--CRLF-->
}
<!--CRLF--> <!--CRLF-->
/**
<!--CRLF-->
* Return a Cursor over the list of all notes in the database
<!--CRLF-->
*
<!--CRLF-->
* @return Cursor over all notes
<!--CRLF-->
*/
<!--CRLF-->
public Cursor fetchAllNotes() {
<!--CRLF-->
return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE,KEY_BODY}, null, null, null, null, null);
<!--CRLF-->
}
<!--CRLF--> <!--CRLF-->
/**
<!--CRLF-->
* Return a Cursor positioned at the note that matches the given rowId
<!--CRLF-->
*
<!--CRLF-->
* @param rowId id of note to retrieve
<!--CRLF-->
* @return Cursor positioned to matching note, if found
<!--CRLF-->
* @throws SQLException if note could not be found/retrieved
<!--CRLF-->
*/
<!--CRLF-->
public Cursor fetchNote(long rowId) throws SQLException {
<!--CRLF--> <!--CRLF-->
Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,KEY_TITLE,
<!--CRLF-->
KEY_BODY}, KEY_ROWID + "=" + rowId, null, null, null, null, null);
<!--CRLF-->
if (mCursor != null) {
<!--CRLF-->
mCursor.moveToFirst();
<!--CRLF-->
}
<!--CRLF-->
return mCursor;
<!--CRLF-->
}
<!--CRLF--> <!--CRLF-->
/**
<!--CRLF-->
* Update the note using the details provided. The note to be updated is specified using the rowId,
<!--CRLF-->
*and it is altered to use the title and body values passed in
<!--CRLF-->
*
<!--CRLF-->
* @param rowId id of note to update
<!--CRLF-->
* @param title value to set note title to
<!--CRLF-->
* @param body value to set note body to
<!--CRLF-->
* @return true if the note was successfully updated, false otherwise
<!--CRLF-->
*/
<!--CRLF-->
public boolean updateNote(long rowId, String title, String body) {
<!--CRLF-->
ContentValues args = new ContentValues();
<!--CRLF-->
args.put(KEY_TITLE, title);
<!--CRLF-->
args.put(KEY_BODY, body);
<!--CRLF-->
return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
<!--CRLF-->
}
<!--CRLF-->
}
Android数据存储之SQLite数据库存储相关推荐
- 【转】Android使用嵌入式关系型SQLite数据库存储数据【学习记录】
为什么80%的码农都做不了架构师?>>> 除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成 ...
- Android 第十一课 SQlite 数据库存储
Android 为了让我们能够更加方便的管理数据库,特意提供了一个SQLiteOpenHelper帮助类,通过借助这个类就可以非常简单的对数据库进行创建和升级. SQLiteOpenHelper是一个 ...
- 安卓 sqlite数据存入mysql_详解Android数据存储—使用SQLite数据库
SQLite是Android自带的关系型数据库,是一个基于文件的轻量级数据库.Android提供了3种操作数据的方式,SharedPreference(共享首选项).文件存储以及SQLite数据库. ...
- Android数据存储、文件存储、SQLite数据库简单使用、 sharedPreferences存储(五)
文章目录 5 数据存储 5.1 数据的存储方式 5.2 文件存储 5.2.1 将数据存入文件中 5.2.2 从文件中读取数据 5.2.3 实战演练-保存QQ账号和密码(内部存储) 5.2.4 实战演练 ...
- 使用嵌入式关系型SQLite数据库存储数据
除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NUL ...
- 数据存储之 SQLite 数据库操作(三)
上一讲中我们讲到了SQLite数据库的操作方法 [数据存储之SQLite数据库操作(二)],我们主要是以SQL语句对数据库进行增删改查,这一讲我们来学习一下 Android 建议的对数据库的操作方法 ...
- 数据存储之 SQLite 数据库操作(二)
上一讲我们讲解了SQLite数据库的创建[数据存储之 SQLite 数据库操作(一)],还有更新的操作,这一讲我们来讲解一下数据库的增删改查,这边的程序是对上一个程序进行修改,建议结合上一讲内容进行学 ...
- 数据存储之 SQLite 数据库操作(一)
这一讲我们来讲解一下数据库的存储方式 ,SQLite数据库属于文本型的数据库,它是以文本的形式来保存的. 1. SQLite 数据库介绍 查看 Android API文档中 SQLite 的介绍 ...
- Android 绿豆通讯录【SQLite数据库---数据库(增删改查、展示数据)】
前情提要:Android 数据库(SQLite) [简介.创建.使用(增删改查.事务.实战演练).数据显示控件(ListView.Adapter.实战演练-绿豆通讯录)] https://blog.c ...
最新文章
- 【Qt】QtCreator导入cmake工程
- 皮一皮:浓浓的父爱...
- TNNLS 22|分数不是关键,排名才是关键:针对排行榜的模型“行为”保持与灾难性遗忘的克服...
- SSH免密直接登录方法
- 非关系型数据库(非RDBMS)介绍
- java字符串排序_对字符串排序持一种宽容的心态
- 关于mysql单表支持的最大大小
- MongoDB学习笔记~以匿名对象做为查询参数,方便查询子对象
- Redis之Redis事务
- wsl使用可视化界面_WSL 科学计算〇 | 适合计算化学的环境配置
- 因子分析以及SPSS实现
- DataStream API:Event Time(Generating Watermarks)
- 深信服负载均衡开发实习面经
- 2017,那些引发关注的新建展馆
- 如何删除PDF空白签名域?
- js获取最新的省市区地址
- js 下拉层级多选_Jquery实现select二级联动多选下拉菜单
- 取出数组第一大和第二大元素
- CommMonitor监控串口数据
- 布局数据存储,中国电子云意在何为?
热门文章
- 双层板在哪层覆铜_多层板的生产过程,与双层板有何不同?
- android activty动画,Activity动画效果
- 编写10ms延时的子程序c语言,求解!!!用汇编语言编写延时程序问题!!!!...
- html5 PHP 分片上传,H5分片上传含前端JS和后端处理(thinkphp)
- 如何能写出,一份让 HR 认同的简历
- 自主可控计算机大会2019,荣科科技受邀参加2019自主可控计算机大会
- 开发 系统键盘发送按钮不可点击_HoloLens开发指南(2)---HoloLens模拟器介绍
- webrtc java api_java – 使用WebSockets实现WebRTC信令
- diff测试与流量回放测试
- 软件测试职业发展-王学丹