Android存储方式二:sqlite数据库

说明

应用运行需要保存一系列有一定结构的数据, 比如说公司员工信息

文件类型: .db

数据保存的路径: /data/data/projectPackage/databases/xxx.db

默认情况下其它应用不能访问, 当前应用可以通过ContentProvider提供其它应用操作

应用卸载时会删除此数据

sqlite数据库

SQLite (http://www.sqlite.org/),是一款轻型的关系型数据库服务器, 移动设备的数据库存储都使用SQLite, 它的特点:

安装文件小: 最小只有几百K, Android系统已经安装

支持多操作系统: Android, WP, IOS, Windows, Linux等

支持多语言: 比如 Java 、 PHP、C#等.

处理速度快: 处理速度比Mysql, Oracle, SqlServer都要快(数据量不是特别大)

Sqlite中的一个数据库就是一个.db文件(本质上.db的后缀都可以不指定)

数据类型

Sqlite支持的数据类型与Mysql相似, 常用的数据类型:

INT/INTEGER : 整数

FLOAT/DOUBLE : 小数

CHAR/VARCHAR/TEXT : 字符串文本

BLOB : 文件

DATE/ DATETIME : 日期/日期时间

Sqlite建表

Sqlite操作数据库的sql语句基本与mysql一样, 但需要注意下面2个点:

最大的不同在于创建表时可以不用指定字段类型, Sqlite可以适时的自动转换, 但除varchar类型外最好指定类型

Sqlite中的主键最名称建议使用_id

 create table employee (
   _id integer primary key autoincrement, /*主键,自增长*/
   name varchar,                /*字符串*/
   salary double,                                /*小数*/
   birthday date                                /*日期, 可直接插入日期格式字符串*/
 )

sqlite的crud语句

 /*插入*/
 INSERT INTO employee (name,salary,birthday) VALUES('Tom', 8000, '1988-09-21');
 /*删除*/
 DELETE FROM employee WHERE _id=2 
 /*更新*/
 UPDATE employee SET name='Jack',salary=salary+1000 WHERE _id=1
 /*查找*/
 SELECT * FROM employee where _id=3

相关API

SQLiteOpenHelper: 数据库操作的抽象帮助类

  SQLiteOpenHelper(Context context, String name, 
       CursorFactory factory, int version) : 构造方法, 指定数据库文件名和版本号
  abstract void onCreate(SQLiteDatabase db) : 用于创建表
  abstract void onUpgrade() : 用于版本更新
  SqliteDatabase getReadableDatabase() : 得到数据库连接

SqliteDatabase: 代表与数据库的连接的类

   long insert(): 用于执行insert SQL, 返回id值
   int update(): 用于执行update SQL
   int delete(): 用于执行delete SQL
   Cursor query(): 用于执行select SQL, 返回包含查询结果数据的Cursor
   void execSql(sql) : 执行sql语句

   beginTransaction(): 开启事务
   setTransactionSuccessful(): 设置事务是成功的
   endTransaction(): 结束事务, 可能提交事务或回滚事务
   openDatabase(String path, CursorFactory factory, int flags):  得到数据库连接

Cursor : 包含所有查询结果记录的结果集对象(光标,游标)

int getCount() : 匹配的总记录数
boolean moveToNext() : 将游标移动到下一条记录的前面
Xxx getXxx(columnIndex) : 根据字段下标得到对应值
int getColumnIndex(columnname): 根据字段名得到对应的下标

案列

首先第一步创建一个帮助类
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context, int version) {
    super(context, "dongge.db", null, version);
}

/**
 * 什么时候才会创建数据库文件?
 * 1). 数据库文件不存在
 * 2). 连接数据库
 * 什么时候调用?
 * 当数据库文件创建时调用(1次)
 * 在此方法中做什么?
 * 建表
 * 插入一些初始化数据
 */
@Override
public void onCreate(SQLiteDatabase db) {
    Log.e("TAG", "DBHelper onCreate()");
    //建表
    String sql = "create table person( _id integer primary key autoincrement,name varchar,age int)";
    db.execSQL(sql);
    //插入一些初始化数据
    db.execSQL("insert into person(name,age) value ('Tom1',21)");
    db.execSQL("insert into person(name,age) value ('Tom2',22)");
    db.execSQL("insert into person(name,age) value ('Tom3',23)");
}

//当传入的版本号大于数据库的版本号时调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.e("TAG", "DBHelper onUpgrade()");
}
}
创建表
    DBHelper dbHelper = new DBHelper(this, 1);
    SQLiteDatabase database = dbHelper.getReadableDatabase();//与数据库建立连接
    Toast.makeText(this, "创建数据库", Toast.LENGTH_SHORT).show();
更新表
 public void testUpdateDB(View v) {
    DBHelper dbHelper = new DBHelper(this, 2);
    //获取连接
    SQLiteDatabase database = dbHelper.getReadableDatabase();

    Toast.makeText(this, "更新数据库", Toast.LENGTH_SHORT).show();
}
插入数据库
     DBHelper dbHelper = new DBHelper(this, 2);
    //获取连接
    SQLiteDatabase database = dbHelper.getReadableDatabase();
    //执行插入语句
    ContentValues values = new ContentValues();
    values.put("name", "jack");
    values.put("age", 18);
    long id = database.insert("person", null, values);
    //关闭连接
    database.close();
    //提示
    Toast.makeText(this, "id==" + id, Toast.LENGTH_SHORT).show();
更新数据库
     DBHelper dbHelper = new DBHelper(this, 2);
    //获取连接
    SQLiteDatabase database = dbHelper.getReadableDatabase();
    //执行插入语句
    ContentValues values = new ContentValues();
    values.put("name", "jack2");
    values.put("age", 20);
    int updateCount = database.update("person", values, "_id=?", new String[]{"4"});
    database.close();
    Toast.makeText(this, "updateCount==" + updateCount, Toast.LENGTH_SHORT).show();
删除数据
   DBHelper dbHelper = new DBHelper(this, 2);
    //获取连接
    SQLiteDatabase database = dbHelper.getReadableDatabase();
    //执行删除语句
    int delete_id = database.delete("person", "_id=?", new String[]{"2"});
    //关闭数据库
    database.close();
    Toast.makeText(this, "delete_id==" + delete_id, Toast.LENGTH_SHORT).show();
查询语句
     DBHelper dbHelper = new DBHelper(this, 2);
    //获取连接
    SQLiteDatabase database = dbHelper.getReadableDatabase();
    //执行查询语句
    //Cursor cursor = database.query("person", null, null, null, null, null, null);//查询所有数据
    Cursor cursor = database.query("person", null, "_id=?", new String[]{"3"}, null, null, null);//查询所有数据
    //得到匹配的记录数
    int count = cursor.getCount();
    Log.e("TAG", String.valueOf(count));
    while (cursor.moveToNext()) {
        int id = cursor.getInt(0);
        String name = cursor.getString(1);
        int age = cursor.getInt(cursor.getColumnIndex("age"));
        Log.e("TAG", "id=" + id + ";age=" + age + ";name=" + name);
    }
    //关闭
    cursor.close();
    database.close();
测试事务处理

一个功能中对数据库进行的多个操作: 要就是都成功要就都失败

事务处理的3步:

 * 1. 开启事务(获取连接后)
 * 2. 设置事务成功(在全部正常执行完后)
 * 3. 结束事务(finally中)

    SQLiteDatabase database = null;
    int updateCount = 0;
    try {
        DBHelper dbHelper = new DBHelper(this, 2);
        //获取连接
        database = dbHelper.getReadableDatabase();
        //开启事务(连接成功后)
        database.beginTransaction();
        //执行更新第一条语句
        ContentValues values = new ContentValues();
        values.put("age", 110);
        updateCount = database.update("person", values, "_id=?", new String[]{"1"});
        //出现异常
        boolean isFlage = true;
        if (isFlage) {
            throw new RuntimeException("出异常了");
        }
        //执行更新第二条语句
        values = new ContentValues();
        values.put("age", 200);
        int updateCount2 = database.update("person", values, "_id=?", new String[]{"3"});
        //2. 设置事务成功(在全部正常执行完后)
        database.setTransactionSuccessful();
    } catch (RuntimeException e) {
        e.printStackTrace();
        Toast.makeText(this, "出异常啦!!!", Toast.LENGTH_SHORT).show();

    } finally {
        //结束事务
        database.endTransaction();
        database.close();
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值