Android存储方式-SQlite

一、简介

     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>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值