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: }
感谢《第一行代码》作者
- android SQLite的应用
- Android的SQLite应用
- Android中sqlite的应用
- Android中SQLite的应用
- android 的SQLite数据库应用的Demo
- Android Sqlite中row id的应用
- Android 中 SQLite 的应用总结
- 简单的Android SQLite应用设计框架
- Android SQLite的理解和应用
- android应用sqlite遇到的问题
- Android开发之sqlite数据库的应用
- Android开发当中SQLite数据库的应用
- android SQLite应用
- android SQLite数据库应用
- Android开发:SQLite应用
- Android中SQLite应用
- Android SQlite 应用详解
- Android SQLite应用
- redhat 软件包管理
- Collcition的作用及意义
- Spring Transaction属性之propagation
- 2015华为机试练习之合唱队
- Sql Server中GO的作用
- Android的SQLite应用
- linux下,在QT中如何导入第三方的库文件
- 【zzuliOJ】1908 - 小火山的围棋梦想(dfs)
- 数据结构12-线索二叉树
- 1015: 字符串数字置换
- 把Activity设置成Dialog的点击空白消失
- MySQL存储过程详解
- 【栈和队列3】 栈的压入、弹出序列
- 【数据结构】哈夫曼树