Android SQLite小结

来源:互联网 发布:网络电视直播软件排行 编辑:程序博客网 时间:2024/06/04 23:45

Android 系统内置了 SQLite 数据库,它是一款轻量级的关系型数据库,运算速度非常快,占用资源很少,因而特别适合在移动设备上使用。
此外,SQLite还支持标准的 SQL 语法,遵循数据库的 ACID 事务。

1. SQLiteOpenHelper

SQLiteOpenHelper 是一个抽象帮助类,可对数据库进行创建升级。它有两个抽象方法:onCreate()和 onUpgrade()。
因此,使用时必须对它进行继承和重写,然后分别在这两个方法中去实现创建、升级数据库的逻辑。

示例代码:

public class MyDatabaseHelper extends SQLiteOpenHelper {    public static final String CREATE_BOOK = "create table Book ("            + "id integer primary key autoincrement, "            + "author text, "            + "price real, "            + "pages integer, "            + "name text, "            + "category_id integer)";    public static final String CREATE_CATEGORY = "create table Category ("            + "id integer primary key autoincrement, "            + "category_name text, "            + "category_code integer)";    private Context mContext;    /**     * 构造方法参数:     * @param context 上下文     * @param name 数据库名     * @param factory 允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入 null     * @param version  当前数据库的版本号,用于对数据库进行升级操作     */    public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) {        super(context, name, factory, version);        mContext = context;    }    @Override    public void onCreate(SQLiteDatabase db) {        db.execSQL(CREATE_BOOK);        db.execSQL(CREATE_CATEGORY);        Toast.makeText(mContext, "Create successed!", Toast.LENGTH_SHORT).show();    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        /*db.execSQL("drop table if exists book");        db.execSQL("drop table if exists Category");        onCreate(db);*/        switch (oldVersion) {        case 1:            db.execSQL(CREATE_CATEGORY);        case 2:            db.execSQL("alter table Book add columncategory_id integer");        default:        }    }}

注意:
1. 通常把建表语句定义成字符串常量,然后在 onCreate()方法中调用 SQLiteDatabase 的 execSQL()方法去执行这条建表语句。
2. onCreate() 方法只有在创建数据库的时候执行,若数据库已存在,则该方法不执行。

2. 增删改查

2.1 建表

示例代码:

Button createTable = (Button) findViewById(R.id.create_table);createTable.setOnClickListener(new OnClickListener() {        @Override        public void onClick(View v) {            dbHelper.getWritableDatabase();//getWritableDatabase() 方法返回一个 SQLiteDatabase 对象        }});

注:
1. 构建出 SQLiteOpenHelper 的实例后,再调用它的 getReadableDatabase() 或 getWritableDatabase() 方法就能够创建数据库。
2. 数据库文件存放在/data/data/ package name /databases/目录下。

2.2 添加数据

Button addData = (Button) findViewById(R.id.add_data);addData.setOnClickListener(new OnClickListener() {        @Override        public void onClick(View v) {            SQLiteDatabase db = dbHelper.getWritableDatabase();//获取 SQLiteDatabase 对象            ContentValues values = new ContentValues();//使用 ContentValues 来对要添加的数据进行组装            //开始组装第一条数据(注意:不一定按顺序)            values.put("name", "The Da Vinci Code");            values.put("author", "Dan Brown");            values.put("pages", "454");            values.put("price", 16.96);            db.insert("Book", null, values);//插入第一条数据            values.clear();            //开始组装第二条数据            values.put("name", "The Lost Symbol");            values.put("author", "Dan Brown");            values.put("pages", "510");            values.put("price", 19.95);            db.insert("Book", null, values);//插入第二条数据        }});

2.3 更新数据

        /*         * 更新数据         * 第三、四个参数可理解为查询条件:where name = The Da Vinci Code         * ? 号表示占位符         */Button updateData = (Button) findViewById(R.id.update_data);updateData.setOnClickListener(new OnClickListener() {        @Override        public void onClick(View v) {            SQLiteDatabase db = dbHelper.getWritableDatabase();            ContentValues values = new ContentValues();            values.put("price", 10.99);            db.update("Book", values, "name = ?", new String[] { "The Da Vinci Code" });        }});

注:每个数据库版本都会对应一个版本号,当指定的数据库版本号大于当前数据库版本号的时候,就会进入到 onUpgrade()方法中去执行更新操作。

2.4 删除数据

        /*         * 删除数据         * 即条件为:where pages > 500         */Button deleteData = (Button) findViewById(R.id.delete_data);deleteData.setOnClickListener(new OnClickListener() {        @Override        public void onClick(View v) {            SQLiteDatabase db = dbHelper.getWritableDatabase();            db.delete("book", "pages > ?", new String[] { "500" });        }});

2.5 查询数据

        /*         * 查询数据         *          */Button queryData = (Button) findViewById(R.id.query_data);queryData.setOnClickListener(new OnClickListener() {    @Override    public void onClick(View v) {            SQLiteDatabase db = dbHelper.getWritableDatabase();            // 查询book表中的所有数据            Cursor cursor = db.query("Book", null, null, null, null, null, null);            if (cursor.moveToFirst()) {                do {                    // 遍历Cursor对象,取出数据并打印                    //getColumnIndex()方法:获取某一列在表中对应的位置索引                    String name = cursor.getString(cursor.getColumnIndex("name"));                    String author = cursor.getString(cursor.getColumnIndex("author"));                    int pages = cursor.getInt(cursor.getColumnIndex("pages"));                    double price  = cursor.getDouble(cursor.getColumnIndex("price"));                    Log.d("MainActivity", "book name is " + name);                    Log.d("MainActivity", "book author is " + author);                    Log.d("MainActivity", "book pages are " + pages);                    Log.d("MainActivity", "book price is " + price);                } while(cursor.moveToNext());            }            cursor.close();//关闭 Cursor    }});

2.5.1 Cursor(光标)的相关方法

移动光标方法:

public abstract boolean move (int offset);// 将记录指针向上 或者 向下移动offset行, offset为正数就是向下,为负数 就是向上;public abstract boolean moveToFirst ();// 光标移动到第一行, 移动成功返回truepublic abstract boolean moveToLast ();// 记录指针移动到最后一行, 如果移动成功返回truepublic abstract boolean moveToPrevious ();// 移动到上一行, 成功返回truepublic abstract boolean moveToNext ();// 移动到下一行, 成功返回truepublic abstract boolean moveToPosition (int position);// 移动到指定行, 成功返回true

获取某个类型的记录:

public abstract float getFloat (int columnIndex);//获取浮点型数据  public abstract int getInt (int columnIndex);//获取整型数据  public abstract long getLong (int columnIndex);//获取长整型数据  public abstract short getShort (int columnIndex);//获取短整型数据  public abstract String getString (int columnIndex);//获取字符串数据 

参考:Android 数据存储 之 SQLite数据库详解

2.6 数据替换

事务的特性:可以保证让某一系列的操作要么全部完成,要么都不完成。

        /*         * 替换数据         * 增加事务(transaction)处理         */Button replaceData = (Button) findViewById(R.id.replace_data);replaceData.setOnClickListener(new OnClickListener() {    @Override    public void onClick(View v) {            SQLiteDatabase db = dbHelper.getWritableDatabase();            db.beginTransaction();// 开启事务            try {                db.delete("Book", null, null);                /*if (true) {                    // 在这里手动抛出一个异常,让事务失败。此时后面的数据无法添加,且未删除;但注释掉本句后面的语句能执行,数据成功添加!                        throw new NullPointerException();                    }*/                ContentValues values = new ContentValues();// 为什么是Dead code ??因为抛出了Exception,后面不再继续执行                values.put("name", "Game of Thrones");                values.put("author", "George Martin");                values.put("pages", 750);                values.put("price", 20.85);                db.insert("Book", null, values);                db.setTransactionSuccessful();// 事务已执行成功            } catch (Exception e) {                e.printStackTrace();            } finally {                db.endTransaction();            }    }});

上述代码的流程:
首先调用 SQLiteDatabase 的 beginTransaction() 方法来开启一个事务;然后在一个异常捕获的代码块中去执行具体的数据库操作,当所有的操作都完成之后,调用 setTransactionSuccessful()表示事务已经执行成功了。

2.7 配置环境变量

把sdk 下的 platform-tools 路径添加到环境变量的 Path下,如图所示:

abd shell

查看表命令:
1. 进入控制台:adb shell
2. 进入目录:cd /data/data/com.example.dbtest/databases/到相应目录下
3. 查看文件:ls
4. 打开数据库:sqlite3 dbname.db
5. 查看有哪些表:.table
6. 退出:.exit 或 .quit
7. 查看建表语句:.schema
接下来就能做些增删改查操作了。

注:android_metadata为自动生成。

内容主要来源:《第一行代码》

此外,Android中SQLite应用详解 这篇文章介绍得很详细,很不错!

0 0