【Android】数据持久化补充:SQLite数据库存储
2016-01-10 21:56
471 查看
在上一篇博客——《第一行代码—Android》基础知识点总结chapter6——中,已经对“文件存储”、“SharedPreferenced存储”这两种数据持久化方式做了简要说明,在这片文章中我们再来简单看看SQLite数据库存储,下面进入实战时间。
Android系统中内置了SQLite数据库。那么什么是SQLite数据库呢?SQLite数据库就是一款轻量级的关系型数据库,他的运算速度非常快,而且占用的资源非常小,通常只需要几百KB的内存就够了。不仅支持表春的SQL语法,而且还支持数据库的ACID事物,简单易用!
SQLite数据库适合存储大型、关系复杂的数据。Android中SQLite数据库的使用主要分为六块:创建数据库——升级数据库——添加数据——更新数据——删除数据——查询数据。
下面我们分为两部分:第一部分包括数据库的创建、升级,向数据表中添加数据等内容;第二部分包括更新数据、删除数据、查询数据等内容。分别来看是怎么使用的。
创建、升级数据库,向数据表中添加数据
Android为方便我们更方便的管理数据库,提供了一个
创建一个
在
修改
在
更新数据、删除数据、查询数据
由于这部分内容前后代码改动太大,这里我不做详细说明,只将最终的代码贴出来,如果要详细了解请参看郭霖大神写的《第一行代码—Android》第六章第四节内容。
Android系统中内置了SQLite数据库。那么什么是SQLite数据库呢?SQLite数据库就是一款轻量级的关系型数据库,他的运算速度非常快,而且占用的资源非常小,通常只需要几百KB的内存就够了。不仅支持表春的SQL语法,而且还支持数据库的ACID事物,简单易用!
SQLite数据库适合存储大型、关系复杂的数据。Android中SQLite数据库的使用主要分为六块:创建数据库——升级数据库——添加数据——更新数据——删除数据——查询数据。
下面我们分为两部分:第一部分包括数据库的创建、升级,向数据表中添加数据等内容;第二部分包括更新数据、删除数据、查询数据等内容。分别来看是怎么使用的。
创建、升级数据库,向数据表中添加数据
Android为方便我们更方便的管理数据库,提供了一个
SQLiteOpenHelper帮助类。
SQLiteOpenHelper是一个抽象类,使用时需要我们自己去实现它,要创建
SQLiteOpenHelper的实现类,并重写它的两个抽象方法
onCreate()、
onUpgrade()。另外
SQLiteOpenHelper还有两个非常重要的实例方法,
getReadableDatabase()方法和
getWritableDatabase()方法,用于创建或打开一个数据库。
创建一个
DatabaseTest项目,新建
MyDatabaseHelper类继承自
SQLiteOpenHelper,代码如下
package com.example.databasetest; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.widget.Toast; 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)"; public static final String CREATE_CATEGORY = "create table Category (" + "id integer primary key autoincrement, " + "category_name text, " + "category_code integer)"; private Context mContext; 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 succeeded", Toast.LENGTH_LONG).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); } }
在
MyDatabaseHelper中先创建了两张数据表
Book和
Category,我们把建表语句定义成了一个字符串常量,然后在
onCreate()方法中又调用
SQLiteDatabase的
execSQL()方法去执行上面定义的建表语句,并弹出一条Toast提示创建成功。在
onUpgrade()方法中调用
SQLiteDatabase的
execSQL()方法执行了
db.execSQL("drop table if exists Book")和
db.execSQL("drop table if exists Category"),如果发现数据中已经存在
Book和
Category这两张表,就将他们删除掉,再调用
onCreate()方法去重新创建。下面看
activity_main.xml文件,代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/create_database" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/create_database" /> <Button android:id="@+id/add_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/add_data" /> </LinearLayout>
修改
MainActivity代码如下
package com.example.databasetest; import android.app.Activity; import android.content.ContentValues; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 3); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { dbHelper.getWritableDatabase(); } }); Button addData = (Button) findViewById(R.id.add_data); addData.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { SQLiteDatabase db = dbHelper.getWritableDatabase(); 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 Lost Symbol"); values.put("author", "Dan Brown"); values.put("pages", 510); values.put("price", 19.95); db.insert("Book", null, values); } }); } }
在
MainActivity中我们构建了
MyDatabaseHelper对象,并且通过构造函数把数据库名指定为
BookStore.db
更新数据、删除数据、查询数据
由于这部分内容前后代码改动太大,这里我不做详细说明,只将最终的代码贴出来,如果要详细了解请参看郭霖大神写的《第一行代码—Android》第六章第四节内容。
MyDatabaseHelper类代码如下
package com.example.databasetest2; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.widget.Toast; 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)"; public static final String CREATE_CATEGORY = "create table Category (" + "id integer primary key autoincrement, " + "category_name text, " + "category_code integer)"; private Context mContext; 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 succeeded", Toast.LENGTH_LONG).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); } }
MainActivity代码如下
package com.example.databasetest2; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2); Button createDatabase = (Button) findViewById(R.id.create_database); createDatabase.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { dbHelper.getWritableDatabase(); } }); Button addData = (Button) findViewById(R.id.add_data); addData.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { SQLiteDatabase db = dbHelper.getWritableDatabase(); 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 Lost Symbol"); values.put("author", "Dan Brown"); values.put("pages", 510); values.put("price", 19.95); db.insert("Book", null, values); } }); 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"}); } }); 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"}); } }); 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, null); if (cursor.moveToFirst()) { do { // 遍历Cuesor对象,取出数据并打印 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 is " + pages); Log.d("MainActivity", "book price is " + price); } while (cursor.moveToNext()); } cursor.close(); } }); 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(); 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(); } } }); } }
activity.xml代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/create_database" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/create_database" /> <Button android:id="@+id/add_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/add_data" /> <Button android:id="@+id/update_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/update_data" /> <Button android:id="@+id/delete_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/delete_data" /> <Button android:id="@+id/query_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/query_data" /> <Button android:id="@+id/replace_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/replace_data" /> </LinearLayout>
相关文章推荐
- 使用Android简单实现有道电子词典
- Android SDK Manager国内下载缓慢的问题
- android之NDK(jni)开发笔记1——运行第一个NDK程序
- 使用android studio迁移项目到不同的svn仓库
- 27.Android之ImageView获取图片学习
- android中关于notification的最新用法
- 【Android】使用SeekBar调整图像的色度、饱和及度亮度
- android WindowManager addView Demo
- android自定义popupwindow动画
- MTK6577+Android之Camera驱动
- Android 小方法
- android无限轮播banner图片--viewpager
- Android编程规范-学习方法-心得总结(不断更新)
- 从源码角度分析Android Context 对象
- Android Animation使用
- 安卓进程通讯之messenger
- Android为ViewPager增加切换动画——使用属性动画
- Android消息循环分析
- Android-在浏览器启动Activity
- Android ListPreference的用法