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

来源:互联网 发布:兄弟连it教育怎么样 编辑:程序博客网 时间:2024/06/06 02:37

一、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); //插入行的IDvalues.clear();  //清空后重新put值,插入新值,就不需要重new ContentValuesvalues.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
原创粉丝点击