Android——数据存储之SQLite数据库

一、SQLite简介

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

    ——支持高达2TB大小的数据库

    ——每个数据库以单个文件的形式存在

    ——每个文件以B-Tree的数据结构形式存储在磁盘

二、特点主要包括:

    1. 轻量级   一个动态库即单文件

    2. 独立型   没有依赖、无需安装

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

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

    5. 多语言接口   支持众多编程语言

    6. 安全性  事务处理的安全性

            ——通过数据库上的独占性和共享锁来实现独立事务处理

            ——多个进程可以同一时间从同一数据库读取数据,但只有一个可以写入数据。

三、SQLite的数据类型

      1. 支持NULL(空值)、INTEGER(整型值)、REAL(浮点值)、TEXT(字符串值)、BLOB(二进制对象)

      2. 动态数据类型(弱引用)

           当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储。

      注意:主键为INTEGER时,再转换类型就会报错。

四、使用须知

    -由于资源占用少、性能良好和零管理成本,嵌入式数据库有了它的用武之地。如Android、IOS

    -没有可用于SQLite的网络服务器、只能通过网络共享,可能存在文件锁定或者性能问题。

    -只提供数据库级的锁定

    -没有用户账户概念,而是根据文件系统确定所有数据库的权限。


五、在Android中如何使用SQLite(主要两个类)

   -SQLiteDatabase  

  (1)提供了一些管理SQLite数据库的类

  (2)提供创建,删除,执行SQL命令,并执行其他常见的数据库管理任务的方法。

  (3)每个程序的数据库名字是唯一的,默认情况下是各自互相不干扰。

db.execSQL(sql)  //执行任何SQL语句
db.insert(table,nullColumnHack,values)
db.delete(table,whereClause,whereArgs)
db.update(table,values,whereClause,whereArgs)
db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy)
db.rawQuery(sql,selectionArgs) //sql语句查询

   -SQLiteOpenHelper 


1.创建一个数据库并且打开(Activity间接继承Content,Content提供方法openOrCreateDatabase())

SQLiteDatabase db= openOrCreateDatabase("name数据库名字.db", mode权限——可读可写私有库, factory可为null);
db.execSQL("create table if not exists usertb (_id integer primary key autoincrement, name text not null,age integer not null, sex text not null)");//建议主键的名字一定写上下划线  完成表的创建
db.execSQL("insert into usertb(name,sex,age) values('张三','女',18)");
Cursor cursor = db.rawQuery("select * from usertb",null);//查询结果存在Cursor对象中
if(cursor!=null){
  c.moveToFirst();//其实默认就在第一行
  while(cursor.moveToNext()){
       cursor.getInt(cursor.getColumnIndex("_id")); //取第一行的第一个字段
       cursor.getString(cursor.getColumnIndex("name")); //取第一行的第二个字段
       cursor.getInt(cursor.getColumnIndex("age")); //取第一行的第三个字段
       cursor.getString(cursor.getColumnIndex("sex")); //取第一行的第四个字段
  }
   cursor.close(); //关闭游标、释放内存
}
db.close();//释放数据库所占内存


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

Cursor:游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等,常用方法:

getCount()//总记录条数
isFirst() //判断是否第一条记录
isLast()  //判断是否最后一条记录
moveToFirst()  //移动到第一条记录
moveToLast() //移动到最后一条记录
move(int offset) //移动到指定记录
moveToNext()  //移动到下一条记录
moveToPrevious() //移动到上一条记录
getColumnIndexOrThrow(String columnName) //据列名称获得列索引
getInt(int columnIndex)//获得指定列索引的int类型值
getString(int columnIndex)//获得指定列索引的String类型值

六、Android内置函数访问SQLite数据库

1. ContentValues: 这个类用来存储一组可以被ContentResolver处理的值

   (1)ContentValues values = new ContentValues();//类似hashMap key value

   (2)values.put("name","张三");

   (3)执行对应的Sql操作

SQLiteDatabase db= openOrCreateDatabase("name数据库名字.db", mode权限——可读可写私有库, factory可为null);
db.execSQL("create table if not exists stutb(_id integer primary key autoincrement, name text not null,age integer not null, sex text not null)");//建议主键的名字一定写上下划线  完成表的创建
ContentValues values = new ContentValues();
values.put("name","张三");
values.put("sex","男");
values.put("age",19);
long rowID = db.insert("stutb",null,values); //插入行的ID
values.clear();  //清空后重新put值,插入新值,就不需要重new ContentValues
values.put("name","张已");
values.put("sex","男");
values.put("age",20);
db.insert("stutb",null,values);
//更新
values.clear();
values.put("sex","女");
db.update("stub",values,"_id>?",new String[]{"3"}); //将所有ID大于3的性别改为女
//删除
db.delete("stutb","name like ?",new String[]{"%风%"});//删除所有名字中带有风的人
//查询
Cursor c = db.query("stutb",null,"_id>?",new String[]{"0"},null,null,"name");
if(c!=null){
   String[] columns = c.getColumnNames();//获取所有的字段名字
   while(c.moveToNext()){
       for(String columnName:columns){
           Log.i("info",c.getString(c.getColumnIndex(columnName)));
       }
   }
c.close();
}
db.close();

七、SQLiteOpenHelper——可以控制数据库的初始化操作

1. SQLiteOpenHelper是SQLiteDatabase的帮助类,用于管理数据库的创建和版本更新

2. 一般要建立一个类继承它(名为DBOpenHelper),并重写构造函数及onCreate()和onUpgrade()方法

3. 方法说明

  (1)onCreate(SQLiteDatabase db)  首次创建数据库时调用 如果以有这个库,则不会自动回调该方法,一般可把建库建表的操作放于此

           db.execSQL("create table if not exists stutb(_id integer primary key autoincrement,name text not null,sex text not null, age integer not null"));

           db.execSQL("insert into stutb(name,sex,age) values ('张上','女',14)");

  (2)onUpgrade(SQLiteDatabase db, int oldVersion, int new Version)  当数据库的版本发生变化时自动调用

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

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

4. 示例

DBOpenHelper helper = new DBOpenHelper(MainActivity.this,"stu.db");
//helper.getReadableDatabase();//获取一个只读数据库,只能查询
SQLiteDatabase db = helper.getWritableDatabase();
Cursor c=db.rawQuery("select * from stutb",null);
if(c!=null){
   //与上面ContenValues中一样
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值