Android的SQLite应用

来源:互联网 发布:热点软件 编辑:程序博客网 时间:2024/05/20 05:30

Android SQLite应用

Android为方便管理提供了一个SQLiteOpenHelper的帮助类,通过这个类,我们可以非常简单对数据库进行一系列操作(CRUD)

  • C是Create(创建)
  • R是Retrieve(查询)
  • U是Update(更新)
  • D是Delete(删除)

SQLiteOpenHelper介绍

这是一个抽象类,使用的时候必须需要继承该类,并且 必须 重写 onCreate(), onUpgrade() 这两个方法,也可以选择性重写 onOpen() 方法。如果此时没有数据库,onCreate() 方法将会重写创建一个数据库。

两个作用实例方法

SQLiteOpenHelper 提供两个重要的实例方法,分别是 getReadableDatabase()getWritableDatabase(),这两个方法都可用于数据库的 创建打开,但是他们之间也有略微的区别。

两者区别

  • getReadableDatabase() 调用此方法后将会打开数据库,并且调用onCreate(), onUpgrade()onOpen()(这个方法可选)几个方法,进行相关操作。如果此时没有存储空间了,那么数据库是处于一个 只读 状态,会返回一个 只读数据对象
  • getWritableDatabase() 和前面一个方法一样同样会调用几个方法,进行相关操作。如果出现了没有存储空间了,那么该方法会将会异常。

Note

  • 当你不需要再使用数据库的时候,用调用 close()方法来关闭它。
  • 数据库更新可能会需要很长时间以及创建,不应该在main线程操作。

构造方法

SQLiteOpenHelper()重写这个构造方法,用于创建,打开,管理数据库。这个方法不会真正创建,打开数据库。该方法有4个参数(其中一个是4个参数,一共提供两个方法)。

  • context 不知道怎么解释。
  • name 数据库名称
  • factory 使用一个cursor对象,一般使用null
  • version 版本号,更新的时候,需要修改这

SQL语法

SQL语法,在前一篇文章有介绍,不多说了。

示例—创建数据库

创建一个“Book”表,表中有id,作者,价格,页数,书名。

新建一个DatabaseHelper

public class DatabaseHelper extends SQLiteOpenHelper {//创建一个表public static final String CREATE_BOOK ="create table book(" +        "id integer primary key autoincrement," +        "author text," +        "price real," +        "pages integer," +        "name text)";private Context mContext;public DatabaseHelper(Context context, String name,                      SQLiteDatabase.CursorFactory factory, int version) {    super(context, name, factory, version);    mContext = context;}@Overridepublic void onCreate(SQLiteDatabase db) {    db.execSQL(CREATE_BOOK);    Toast.makeText(mContext,"create succeed",Toast.LENGTH_SHORT).show();}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }}

MainActivity中的代码

public class MainActivity extends Activity {private DatabaseHelper dbHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main_activity);    //指定数据库名为BookStore.db    //版本号为1    dbHelper = new DatabaseHelper(this, "BookStore.db", null, 1);    Button btnCreateSQL = (Button) findViewById(R.id.btnCreateSQL);    btnCreateSQL.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            //当第一次点击按钮,就会检测是否有BookStore这个数据库            //如果没有就会调用DatabaseHelper中onCreate方法,进行创建            //如果有就不会创建            dbHelper.getWritableDatabase();        }    });  }}

示例—升级数据库

此时,我们又想往数据库中加入一个“Category”表,需要注意的是app一旦创建表后,就不会在执行onCreate()方法,如果要添加一个新表,需要在 onUpgrade()方法中执行。例子中还使用了DROP语句,意思是如果发现了“XXX”表,将其删除。

public class DatabaseHelper extends SQLiteOpenHelper {//创建一个表public static final String CREATE_BOOK ="create table book(" +        "id integer primary key autoincrement," +        "author text," +        "price real," +        "pages integer," +        "name text)";private Context mContext;//在创建一个表categorypublic static final String CREATE_CATEGORY = "create table Category(" +        "id integer primary key autoincrement," +        "category_name text," +        "category_code integer)";public DatabaseHelper(Context context, String name,                      SQLiteDatabase.CursorFactory factory, int version) {    super(context, name, factory, version);    mContext = context;}@Overridepublic void onCreate(SQLiteDatabase db) {    db.execSQL(CREATE_BOOK);    db.execSQL(CREATE_CATEGORY);    Toast.makeText(mContext,"create succeed",Toast.LENGTH_SHORT).show();}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    //执行两条drop语句,如果数据库中已经存在Book或者Category表,    //那么将其删除再创建    db.execSQL("drop table if exists Book");    db.execSQL("drop table if exists Category");    onCreate(db);   }}

MainActivity 中只需要把版本号从1改成2即可

dbHelper = new DatabaseHelper(this, "BookStore.db", null, 2);

示例—添加数据

getReadableDatabase()getWritableDatabase() 这个两个方法会返回一个 SQLiteDatabase 对象我们可以对它进行操作, SQLiteDatabase 提供一个 insert() 方法用于添加数据。在 MainActivity 中加入以下代码

//往表中插入数据    Button btnAddData = (Button) findViewById(R.id.btnAdd);    btnAddData.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            SQLiteDatabase db = dbHelper.getWritableDatabase();            //ContentValues用于组装数据            ContentValues values = new 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 Da Lost Symbol");            values.put("author", "Dan Brown");            values.put("pages", 510);            values.put("price", 19.96);            //插入第二条数据            db.insert("Book", null, values);            values.clear();            Toast.makeText(MainActivity.this,                    "Add Succeed", Toast.LENGTH_SHORT).show();        }    });

示例—更新数据

同样 SQLiteDatabase 提供一个 updat()方法来对数据更新。在 MainActivity 中加入以下代码

        //更改数据    Button btnUpdate = (Button) findViewById(R.id.btnUpdate);    btnUpdate.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            SQLiteDatabase db = dbHelper.getWritableDatabase();            ContentValues values = new ContentValues();            //把价格改为10.99            values.put("price", 10.99);            //更新Book表中的name为 The Da Vinci Code的价格            db.update("Book", values, "name=?", new String[]{"The Da Vinci Code"});        }    });

示例—删除数据

同样 SQLiteDatabase 提供一个 delete()方法来对数据更新。在 MainActivity 中加入以下代码

        //删除数据    Button btnDelete = (Button) findViewById(R.id.btnDelete);    btnDelete.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            SQLiteDatabase db = dbHelper.getWritableDatabase();            //删除Book表中的pages大于500的            db.delete("Book", "pages > ?", new String[]{"500"});        }    });

示例—查询数据

同样 SQLiteDatabase 提供一个 query()方法来对数据更新。在 MainActivity 中加入以下代码,以两种形式显示分别是Log打印和TextView显示。

Button btnQuery = (Button) findViewById(R.id.btnQuery);    final TextView tvShow = (TextView) findViewById(R.id.tvShow);    btnQuery.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            SQLiteDatabase db = dbHelper.getReadableDatabase();            Cursor cursor = db.query("Book", null, null, null, null, null, null);            if (cursor.moveToFirst()) {                do {                    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.e("TAG", "book name is " + name);                    Log.e("TAG", "book author is " + author);                    Log.e("TAG", "book pages is " + pages);                    Log.e("TAG", "book price is " + price);                    //TextView显示                    tvShow.setText("book name is " + name.toString() +                            "\n"+                            "book author is " + author.toString() +                            "\n"+                            "book pages is " + pages +                            "\n"+                            "book price is " + price);                } while (cursor.moveToNext());            }            cursor.close();        }    });

效果如图:

Transaction使用

Transaction即为事务,SQLite是支持事务的。事务的特点是:可以保证某个一系列操作要么同时完成,要么全部失败。举个例子:如银行转账A账户给B账户转X元,而银行必须要在A扣钱成功后,才会给B存钱,但是如果在A扣钱后,此时银行系统出现故障,那么B账户存钱失败,这样会导致X元凭空消失,而使用了事务这一个功能,如果出现故障,那么A账户扣钱的行为也会失败。

示例–事务使用

        Button btnReplace = (Button) findViewById(R.id.btnReplace);    btnReplace.setOnClickListener(new View.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();                values.put("name", "Game of Thrones");                values.put("author", "George Martin");                values.put("pages", 720);                values.put("price", 20.85);                db.insert("Book", null, values);                db.setTransactionSuccessful();//事务成功执行            } catch (Exception e) {                e.printStackTrace();            } finally {                db.endTransaction();//结束事务            }        }    });

数据库更新

前面提及到一种数据库方法,在现实中是不可能使用的,因为他会将前一个版本的数据全部删除,如果此时这些数据是属于用户的,那么这个问题是非常严重的,提供另外一种数据更新方法。

示例–数据更新(保留原先数据)

        switch (oldVersion) {        case 1:            db.execSQL(CREATE_CATEGORY_SECOND);        case 2:            //添加category_second_id 到Book表中            db.execSQL("alter table Book add column category_second_id integer");        default:    }

感谢《第一行代码》作者

0 0
原创粉丝点击