SQLite数据库

来源:互联网 发布:sql code 803 编辑:程序博客网 时间:2024/06/04 12:26
一、什么是SQLite?
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。
Android平台集成了SQLite这个轻型数据库,支持的5种数据类型:NULL、INTEGER、REAL(浮点类型)、TEXT(字符串文本类型)和BLOB(二进制对象)。虽然只有这5种,但是SQLite是无类型的.意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中, 无论这列声明的数据类型是什么。无论是varchar、还是char等其他数据类型都是可以保存的。

二、SQLite的图形化工具:SQLite Expert Professional 
SQLite Expert Professional是一款可视化的数据库管理工具,允许用户在 SQLite 服务器上执行创建、编辑、复制、提取等操作。SQLite Expert支持所有的图形界面的SQLite特征。它包括一个可视化查询生成器,一个SQL编辑与语法突出和代码自动完成,强大的table和view设计与导入导出功能
          下载地址
三、使用SQLiteOpenHelper创建数据库与版本管理
在SQLiteOpenHelper中提供了onCreate()和onUpgrade()2个方法实现数据库的创建、数据库的更新等。
onCreate(SQLiteDatabase db): 首次使用app时生成数据库
    
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion):
在数据库版本发生变化时会被调用。假如数据库版本为1,由于业务的变更,需要修改数据库的表结构,所以在app升级过程中更新用户手机里的数据库表结构,为了达到这一目的,可以把原先的数据库版本设置为2或者其他数字(不与旧版本数字一样即可)。

具体实现:
1.自定义类继承SQLiteOpenHelper 
2.该类的构造方法中super()设置好数据库名字与版本号
3.重写onCreate方法创建表结构
4.重写onUpgrade方法定义好版本更新后执行的操作

代码如下:
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
 public MySQLiteOpenHelper(Context context, String name,
   CursorFactory factory, int version) {
  super(context, "my.db", null, 1);
 }
 //数据库第一次创建时被调用
 @Override
 public void onCreate(SQLiteDatabase db) {
  db.execSQL("CREATE TABLE STUDENT(ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME VARCHAR(20))");
 }
 //数据库版本更新时调用
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  db.execSQL("ALTER TABLE STUDENT ADD PHONE VARCHAR(20) NULL");
 }
}



四、实现操作数据库的操作(SQLiteDatabase与cursor)

SQLiteDatabase数据库相关操作

获取SQLiteDatabase
1.静态方法:openDatabase()、openOrCreateDatabase()这个方法用的比较少
SQLiteDatabase db1 = SQLiteDatabase.openDatabase("my.db", null, 1);
 
 SQLiteDatabase db2 = SQLiteDatabase.openOrCreateDatabase("my.db",null);
2.通过SQLiteOpenHelper 对象的getWritableDatabase或者getReadableDatabase方法获取数据库对象
 SQLiteOpenHelper helper = new MySQLiteOpenHelper(this, "my.db", null, 1);
 SQLiteDatabase db1 = helper.getWritableDatabase();
 SQLiteDatabase db2 = helper.getReadableDatabase();
操作数据库的方法

db.execSQL(sql, bindArgs)
使用占位符的SQL语句
db.rawQuery(sql, selectionArgs);
使用占位符的SQL语句查询操作
db.beginTransaction()
开始事务
db.endTransaction();
结束事务
Cursor对象
类似于JDBC中ResultSet(结果集),提供了移动查询结果的记录指针的方法。
move(offset)
指定向上或者向下移动的行数,整数代表向下移动,负数代表向上移动
moveToFirst()
指针移动到第一行,成功返回true
moveToLast()
指针移动到最后一行,成功返回true
moveToNext()
指针移动到下一行,成功返回true,表面下面还有数据
moveToPrevious()
移动到上一行,如果在第一行则会返回false
getCount()
获得总的数据条目
isFirst()
判断是否为第一条记录
isLast()
判断是否为最后一条记录
moveToPosition(position)
移动到指定行

相关数据操作

1.增加数据
public void add(Person p) {
  SQLiteDatabase db = helper.getWritableDatabase();
  db.execSQL("INSERT INTO PERSON(NAME,PHONE)VALUES(?,?)", new Object[] {
    p.getName(), p.getPhone() });
 }
2.删除数据
public void delete(int id) {
  SQLiteDatabase db = helper.getWritableDatabase();
  db.execSQL("DELETE FROM PERSON WHERE ID = ?", new Object[] { id });
 }
3.更新数据
public void update(int id) {
  SQLiteDatabase db = helper.getWritableDatabase();
  db.execSQL("UPDATE PERSON SET NAME = ?,PHONE = ? WHERE ID = ?",
    new Object[] { id });
 }
4.查询数据
public Person find(int id) {
  SQLiteDatabase db = helper.getWritableDatabase();
  Cursor cursor = db.rawQuery("SELECT * FROM PERSON WHERE ID = ?",
    new String[] { id + "" });
  if (cursor.moveToFirst()) {
   String name = cursor.getString(cursor.getColumnIndex("name"));
   String phone = cursor.getString(cursor.getColumnIndex("phone"));
   return new Person(id, name, phone);
  }
  cursor.close();
  return null;
 }
5.查询记录数
public long getCount() {
  SQLiteDatabase db = helper.getWritableDatabase();
  Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM PERSON", null);
  cursor.moveToFirst();
  long result = cursor.getLong(0);
  return result;
 }

五、SQLite事务(Transaction)
什么是事务?
事务(Transaction)是一个对数据库执行工作单元。事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成。
事务(Transaction)是指一个或多个更改数据库的扩展。例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务。重要的是要控制事务以确保数据的完整性和处理数据库错误。

举个简单的例子:用户A向用户B转10元钱
public void transaction(){
  SQLiteDatabase db = helper.getWritableDatabase();
  //开启事务
  db.beginTransaction();
  try {
   db.execSQL("update person set amount=amount-10 where personid=?", new Object[]{1});  
         db.execSQL("update person set amount=amount+10 where personid=?", new Object[]{2});  
   //设置事务标志为成功,当结束事务时就会提交事务  
         db.setTransactionSuccessful();
  } catch (Exception e) {
   
  }finally{
   //关闭事务
   db.endTransaction();
  }
 }
beginTransaction()
开启事务
setTransactionSuccessful()
设置事务标志为成功,当结束事务时就会提交事务 
endTransaction();
结束事务的二个结果:成功或者回滚取决于一个标志,默认false,可以通过setTransactionSuccessful()设置为
true

六、BLOB格式:保存一张图片
1.保存图片
将图片转成BLOB(二进制)格式,在进行存储
try {
   helper = new MySQLiteOpenHelper(this, "my.db", null, 1);
   SQLiteDatabase db = helper.getWritableDatabase();
   ByteArrayOutputStream stream = new ByteArrayOutputStream();
   ((BitmapDrawable)getResources().getDrawable(R.drawable.ic_launcher)).getBitmap().compress(CompressFormat.PNG, 100, stream);
   
   Object[] obj = new Object[]{stream.toByteArray()};
   
   db.execSQL("INSERT INTO TEST(IMG)VALUES(?)",obj);
   
   stream.close();
   db.close();
  } catch (NotFoundException e) {
   e.printStackTrace();
  } catch (SQLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }

2.读取图片
public Drawable getImage() {
  SQLiteDatabase db = helper.getWritableDatabase();
  Cursor cursor = db.rawQuery("select name,image from users",
    new String[] {});
  if (cursor.moveToFirst()) {
   ByteArrayInputStream stream = new ByteArrayInputStream(
     cursor.getBlob(1));
   Drawable image = Drawable.createFromStream(stream, "image");
   return image;
  }
  db.close();
  return null;
 }

0 0