SQLite Database Storage

一,说明

  • 保存有一定结构的数据
  • 文件类型 .db
  • 保存路径:data/data/packageName/databases/xxx.db
  • 默认其他应用不能访问,当前应用可通过Content Provider(四大组件之一)提供其他应用操作
  • 随着应用卸载删除数据
SQLite介绍
优点:
  • 安装文件小,最小只有几百K,Android中已安装
  • 支持多种操作系统:Android,WP,IOS,Windows,Linux
  • 支持多语言:Java,PHP,C#等
  • 处理速度快
  • 一个数据库就是一个.db文件(本质上.db的后缀可以不指定)
数据类型
  • int/integer:整数
  • float/double:小数
  • char/varchar/text:文本
  • blob:文件
  • date/datetime:日期/日期时间
使用示范
# 建表
create table employee(
       _id integer primary key autoincrement,       
       name varchar,
       salary double,       
       birthday date
)
# 增
insert into employee(name,salary,birthday) values('Tom',12000.30,'1992-08-06');
# 删
delete from employee where _id=3;
# 查
select * from employee;
# 改
update employee set salary=salary+500 where _id=1;
SQLite建表
  • 创建表时可以不用指定字段类型,但除varchar外最好指定类型
  • 主键名称建议用_id
  • 基本语法与MySQL一样
adb操作:
  • adb shell 进入系统根目录
  • cd data/data/…/databases : 进入包含数据库文件的文件夹下
  • sqlite3 contacts2.db : 使用sqlite3命令连接指定的数据库文件, 进入连接模式
  • .help : 查看命令列表
  • .tables : 查看所有表的列表
  • 执行insert/delete/update/select语句
  • .exit : 退出数据库连接模式
  • Ctrl + C : 直接退出shell模式

二,API

SQLiteOpenHelper:数据库操作的抽象帮助类
//构造方法,指定数据库文件名和版本号
SQLiteOpenHelper(Context context,String name,CursorFactory factory,int version)
//用于创建表
abstract void onCreate(SQLiteDatabase db)
//用户版本更新
abstract void onUpgrade()
//得到数据库连接
SQLiteDatabase getReadableDatabase()
SQLiteDatabase :代表与数据库连接
//得到数据库连接
SQLiteDatabase openDatabase(String path,CursorFactory factory,int flages)
//增,返回id
long insert()
//删,返回删除记录数
int delete()
//查,
Cursor query()
//改,返回更新记录数
int update()
//执行SQL语句
void execSql(Strng sql)
//开启事务
void beginTransaction()
//设定事务是成功的
void setTransactionSuccessful()
//结束事务,如在提交之前设置事务为成功,则提交,否则回滚
void endTransaction()
Cursor:包含查询记录的结果集对象
//匹配记录数
int getCount()
//将游标移动到下一条记录的前面
boolean moveToNext()
//根据字段名得到字段下标
int getColumnIndex(String columnName)
//根据字段下标得到字段值
Xxx getXxx(int columnIndex)

三,测试源码

DBHelper
public class DBHelper extends SQLiteOpenHelper {

    public DBHelper(Context context, int version) {
        super(context, "quantai.db", null, version);
    }

    /**
     * 什么时候调用? 数据库文件被创建时调用
     * 
     * 什么时候数据库文件创建? 数据库文件不存在且尝试连接数据库时
     * 
     * 在此方法中做什么? 1.创建表 2.表的初始化
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.i("TAG", "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) values('Tom','12')");
        db.execSQL("insert into person(name,age) values('Jane','15')");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i("TAG", "onUpgrade");

    }
}
SQActivity
public class SQActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sq);
    }

    /**
     * 创建数据库
     *
     * @param v clicked view
     */
    public void createDB(View v) {
        DBHelper dbHelper = new DBHelper(this, 1);
        // 获取连接以判定数据库文件是否存在,如果不存在则创建,回调onCreate
        dbHelper.getReadableDatabase();

        Toast.makeText(this, "create database", Toast.LENGTH_SHORT).show();
    }

    /**
     * 更新数据库
     *
     * @param v clicked view
     */
    public void updateDB(View v) {
        DBHelper dbHelper = new DBHelper(this, 2);
        // 获取连接以判断版本是否改变;如果改变,回调onUpgrade
        dbHelper.getReadableDatabase();
    }

    /**
     * 增
     *
     * @param v clicked view
     */
    public void insert(View v) {
        // 1.得到连接
        DBHelper dbHelper = new DBHelper(this, 2);
        SQLiteDatabase database = dbHelper.getReadableDatabase();
        // 2.执行插入
        ContentValues values = new ContentValues();
        values.put("name", "quan");//底层为一个 HashMap<String, Object>
        values.put("age", 10);//插入键的顺序与建表顺序相同
        long id = database.insert("person", null, values);
        // 3.关闭连接
        database.close();
        // 4.提示
        Toast.makeText(this, "insert id= " + id, Toast.LENGTH_LONG).show();
    }

    /**
     * 改
     *
     * @param v clicked view
     */
    public void update(View v) {
        // 1.得到连接
        DBHelper dbHelper = new DBHelper(this, 2);
        SQLiteDatabase database = dbHelper.getReadableDatabase();
        // 2.执行,类似于insert
        ContentValues values = new ContentValues();
        values.put("name", "jack");
        values.put("age", 99);
        int updateCount = database.update("person", values, "_id=?",
                new String[]{"4"});
        // 3.关闭连接
        database.close();
        // 4.提示
        Toast.makeText(this, "updataCount: " + updateCount, Toast.LENGTH_LONG)
                .show();
    }

    /**
     * 删
     *
     * @param v clicked view
     */
    public void delete(View v) {
        // 1.得到连接
        DBHelper dbHelper = new DBHelper(this, 2);
        SQLiteDatabase database = dbHelper.getReadableDatabase();
        // 2.执行
        //delete from person where _id=4;
        int deleteCount = database.delete("person", "_id=?", new String[]{"4"});
        // 3.关闭连接
        database.close();
        // 4.提示
        Toast.makeText(this, "deleteCount: " + deleteCount, Toast.LENGTH_LONG).show();
    }

    /**
     * 查询
     *
     * @param v clicked view
     */
    public void query(View v) {
        // 1.得到连接
        DBHelper dbHelper = new DBHelper(this, 2);
        SQLiteDatabase database = dbHelper.getReadableDatabase();
        // 2.执行
        Cursor cursor = database.query("person", null, null, null, null, null, null);
        int count = cursor.getCount();

        while (cursor.moveToNext()) {//初始指针在结果表的第一行上部
            //_id
            int id = cursor.getInt(0);//获取序列为建表顺序
            //name
            String name = cursor.getString(1);
            //age
            int age = cursor.getInt(2);
            Log.e("TAG", "id:" + id + "-name:" + name + "-age:" + age);
        }
        // 3.关闭连接
        cursor.close();//注意需要关闭cursor
        database.close();
        // 4.提示
        Toast.makeText(this, "QueryCount: " + count, Toast.LENGTH_SHORT).show();
    }

    /**
     * 事务
     * update person set age=13 where _id=1
     * update person set age=13 where _id=1
     * <p/>
     * 一个功能中对数据库进行多个操作,要么都成功,要么都失败
     * step1:开始事务(获取连接后)
     * step2:设置事务成功(正常执行完成后)
     * step3:结束事务(finally)
     *
     * @param v clicked view
     */
    public void trans(View v) {
        SQLiteDatabase database = null;
        try {
            // 1.得到连接
            DBHelper dbHelper = new DBHelper(this, 2);
            database = dbHelper.getReadableDatabase();

            //开始事务
            database.beginTransaction();

            // 2.执行
            //update person set age=13 where _id=1
            ContentValues values = new ContentValues();
            values.put("age", 13);
            int updateCount = database.update("person", values, "_id=?", new String[]{"1"});

            //执行中出现异常
            boolean flag = true;
            if (true) {
                throw new RuntimeException("a error occur!");
            }

            //update person set age=13 where _id=1
            values = new ContentValues();
            values.put("age", 15);
            int updateCount2 = database.update("person", values, "_id=?", new String[]{"3"});

            database.setTransactionSuccessful();

            // 4.提示
            Toast.makeText(this, "updataCount: " + updateCount, Toast.LENGTH_LONG).show();
        } catch (RuntimeException e) {
            e.printStackTrace();
            Toast.makeText(SQActivity.this, "An exception occur!", Toast.LENGTH_SHORT);
        } finally {
            if (database != null) {
                //结束事务
                database.endTransaction();
                // 3.关闭连接
                database.close();
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值