您的位置:首页 > 移动开发 > Android开发

Android存储方式-SQlite

2016-07-13 11:05 429 查看
一、简介

     SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。

二、特点

1、轻量级:一个动态库、单个文件

2、独立性:没有依赖、无需安装

3、隔离性:全部在一个文件夹中

4、跨平台:支持众多操作系统

5、多语言接口:支持多语言编程接口

6、安全性:通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据。

 

三、数据类型支持:

1、NULL : 空值

2、INTEGER : 整数型

3、REAL : 浮点值

4、TEXT : 字符串值

5、BLOB : 二进制对象

 

四、常用方法

1、获取SQLiteDatabase对象:

this.openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory)

参数: name : 数据库名称

             mode:读写模式

             factory:游标工厂类

 

this.openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory,   DatabaseErrorHandler errorHandler)

参数: name : 数据库名称

             mode:读写模式

             factory:游标工厂类

             errorHandler:数据库发生错误时的处理类

 

2、SQLiteDatabase对象的方法

   db.execSQL(String sql)

   参数 sql : sql语句

 

db.insert(String table, String nullColumnHack, ContentValues values)

参数 table : 表名

         nullColumnHack:values参数为空时要创建的列,存放values这个空值

         values : 键值对形式的ContentValues对象

 

db.delete(table, whereClause, whereArgs)

参数 table : 表名

         whereClause : SQL带’?’的条件语句

         whereArgs :
填充’?’的字符串值数组

 

db.update(table, values, whereClause, whereArgs)

参数 table : 表名

         whereClause : SQL带’?’的条件语句

         whereArgs :
填充’?’的字符串值数组

 

public Cursor rawQuery(String sql, String[] selectionArgs)

参数 sql: sql语句

          selectionArgs:
绑定为字符串数组的值

 

public Cursor rawQuery(String sql, String[] selectionArgs, CancellationSignal cancellationSignal)

参数 sql: sql语句

         selectionArgs:
绑定为字符串数组的值

         cancellationSignal:取消执行信号

 

public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

参数 table:表名称

         colums:列名称数组

         selection:条件子句,相当于where

         selectionArgs:条件语句的参数数组

         groupBy:分组

         having:分组条件

         orderBy:排序类

          limit:分页查询的限制

          Cursor:返回值,相当于结果集ResultSet

 

五、关于游标Cursor对象

1、说明:

        Cursor是Android查询数据后得到的一个管理数据集合的类,正常情况下,如果查询得到的数据量较小时不会有内存问题,而且虚拟机能够保证Cursor最终会释放掉。然而如果Cursor的数据量特别大,特别是如果里面有Blob信息时,应该保证Cursor占用的内存被及时的释放掉,而不是等待GC来处理。并且Android明显是倾向于编程者手动将Cursor
close掉,因为在源码中我们发现,如果等到垃圾回收器来回收时,也就是如果不手动关闭,系统会报错,会给用户以错误提示。

2、Cursor的方法

close(): 关闭游标对象

getCount(): 总记录条数

getColumnNames:获取所有列名称

isFirst(): 判断是否第一条记录

isLast(): 判断是否最后一条记录

moveToFirst(): 移动到第一条记录

moveToLast(): 移动到最后一条记录

move(int offset): 移动到指定的记录

moveToNext(): 移动到下一条记录

moveToPrevious(): 移动到上一条记录

getColumnIndex(String columnName):
获得指定列索引的int类型值

getInt(int columnIndex):
获得指定列索引的int类型值

getString(int columnIndex):
获得指定列索引的String类型值

 

六、关于SQLiteOpenHelper

1、说明:

      是SQLiteDatabase的帮助类,用于管理数据库的创建和版本更新;一般是建立一个类继承它,并重新onCreate()和onUpgrade()方法

2、方法

onCreate(SQLiteDatabase db):
创建数据库时调用

onUpgrade(SQLiteDatabase db, int oldVersion, int new Version):
版本更新是调用

getReadableDatabase(): 创建或者打开一个只读数据库

getWritableDatabase(): 创建或者打开一个读写数据库

七、示例

1、用法一

SQLiteDatabase db = openOrCreateDatabase("test1.db", MODE_PRIVATE, null);
db.execSQL("create table if not exists mytable ( _id integer primary key autoincrement, name text not null, age int not null)");
db.execSQL("insert into mytable(name, age) values('小雨',18)");
db.execSQL("insert into mytable(name, age) values('雨阳',20)");
Cursor cursor = db.rawQuery("select * from mytable ", null);
String txt = "";
if(cursor != null){
while(cursor.moveToNext()){
txt += "姓名:" + cursor.getString(cursor.getColumnIndex("name"))+"; 年龄:" +
cursor.getInt(cursor.getColumnIndex("age"))+"\n";
}
cursor.close();
}
//清空表数据(这里为了方便测试)
//db.execSQL("drop table mytable");
db.delete("mytable", "name like ?", new String[]{"小雨","雨阳"});
db.delete("mytable", "age like ?", new String[]{"18","20"});
db.close();
Toast.makeText(this,"执行后,再查询的结果:\n"+txt, 0).show();

2、用法二
SQLiteDatabase db = openOrCreateDatabase("test2.db", MODE_PRIVATE, null);
db.execSQL("create table if not exists mytable(_id integer primary key autoincrement,name text not null,age integer not null)");
ContentValues values = new ContentValues();
values.put("name", "张三");
values.put("age", 19);
db.insert("mytable", null, values);
values.clear();
values.put("name", "张三丰");
values.put("age", 99);
db.insert("mytable", null, values);
values.clear();
values.put("name", "张三封");
values.put("age", 29);
db.insert("mytable", null, values);
values.clear();
values.put("age", 88);
db.update("mytable", values, "_id>?", new String[]{"3"});//将全部id>3的人的年龄改成88
db.delete("mytable", "name like ?", new String[]{"%丰%"});//删除所有名字中带有丰的人
Cursor c = db.query("mytable", null, "_id>?", new String[]{"0"}, null, null, "name");
if (c!=null) {
String text = "";
String [] columns= c.getColumnNames();
while (c.moveToNext()) {
for (String columnName : columns) {
text += c.getString(c.getColumnIndex(columnName))+" ";
}
}
c.close();
tv.setText(text);
}
//清空表数据(这里为了方便测试)
db.execSQL("drop table mytable");
//db.execSQL("delete from mytable");
db.close();

3、用法三
<span style="font-size:18px;">DBOpenHelper helper = new DBOpenHelper(Activity2SQLite.this, "test3.db");
SQLiteDatabase db = helper.getWritableDatabase();//获取可读可写的对象
Cursor c = db.rawQuery("select * from mytable", null);
游标操作和上面的一样,这里就不再详细写了。

DBOpenHelper 类如下:
package com.sqb.demo2;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DBOpenHelper extends SQLiteOpenHelper{
public DBOpenHelper(Context context, String name){
/**
* 改写super的参数
*/
super(context, name, null, 1);
// TODO Auto-generated constructor stub
}
public DBOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
/**
* 首次创建数据库的时候调用,一般可以把建库、建表的操作放到这个方法来执行
*/
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table if not exists mytable(_id integer primary key autoincrement,name text not null,sex text not null,age integer not null)");
db.execSQL("insert into mytable(name,sex,age)values('张三','女',18)");
}
/**
* 当数据库的版本发生变化的时候会自动执行
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub

}
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  SQLite 安卓数据库