我个人感觉安卓自带的数据库用的不是太多的,毕竟现在很多应用都直接和服务器数据库进行交互,或者直接API获取一些接口的数据,但是不可否认自带的数据库还是有一些作用的,所以我们还是需要对自带的数据库进行一定的学习和研究。(前面都是废话)进入正题:
Android为了让我们更好的管理数据库,专门提供了一个SQLiteOpenHelper帮助类,借助这个类就可以简单地对数据库进行创建和升级。SQLiteOpenHelper是一个抽象类,啥是抽象类?抽象类就像领导,一般自己不干活(实例化),只发号司令,所以要想用这个类就必须自己创建一个类去继承它。此外这个类里面还有两个抽象方法,onCreate()和onUpgrade(),我们必须在自己的帮助类里重写这两个方法,然后用这两个方法去创建和升级数据库。
这个类里还有两个重要的实例方法,getReadableDatabase()和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库存在则打开,如果不存在则创建一个新的数据库)话说这两个方法有啥不同呢?当数据库不可写入的时候(比如磁盘已满)第一个方法以只读的方式打开,第二个方法就会出现异常。
废话理论不多说了,下面看一下建表语句:
create table Book( id integer primary key autoincrement, author text, price real, pages integer, name text)
假如上面的看不懂,那你要稍微对SQL语句了解一下,这个不难。
下面编写代码:
package org.lxh.demo; 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)";// SQL语句自己写吧 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);// 创建数据库 Toast.makeText(mcontext, "Create succeeded", Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 自动覆写了 // TODO Auto-generated method stub } }
然后我们在布局文件中搞一个按钮:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="创建数据库" /> </LinearLayout> </LinearLayout>
最后创建一个按钮监听在MainActivity里
package org.lxh.demo; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private Button create; private MyDatabaseHelper myDatabaseHelper; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 生命周期方法 super.setContentView(R.layout.main); // 设置要使用的布局管理器 create = (Button) findViewById(R.id.btn); myDatabaseHelper = new MyDatabaseHelper(this, "BookStore", null, 1);//构造方法里有四个参数哎,填好 create.setOnClickListener(new OnClickListener() {// 匿名内部类 public void onClick(View v) { myDatabaseHelper.getWritableDatabase();// 调用实例方法getWritableDatabase()创建数据库 } }); } }
点击创建按钮就成功创建了,没来的及截图到Toast(因为它只出现一次,也就是数据库只创建一次,自行测试吧):
创建MyDatabaseHelper 中还有一个覆写的方法没用呢,就是onUpgrade()是用于对数据库进行更新的。比如数据库已有一张Book表了,我们现在还想创建一个Catagory表:
package org.lxh.demo; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; 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)";// SQL语句自己写吧 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_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);//最後再創建 } }
MainActivity.java:
package org.lxh.demo; import android.app.Activity; 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 Button create; private MyDatabaseHelper myDatabaseHelper; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 生命周期方法 super.setContentView(R.layout.main); // 设置要使用的布局管理器 create = (Button) findViewById(R.id.btn); myDatabaseHelper=new MyDatabaseHelper(this, "BookStore", null, 2);// 這裡版本號改成2 create.setOnClickListener(new OnClickListener() {// 匿名内部类 public void onClick(View v) { myDatabaseHelper.getWritableDatabase();// 调用实例方法getWritableDatabase()创建数据库 Log.d("Success", "chenggong"); } }); } }
运行如下:
下面我们怎么知道自己创建的数据库有木有成功呢?在哪儿能看到他们呢?我们要通过adb了,这是Android SDK自带的一个调试工具,怎么用嫩?首先你要将你的platform_tools目录配置到环境变量中去:
然后在DOS界面下输入:adb shell,进入到设备的控制台:
然后键入:cd /data/data/org.lxh.demo/databases/下:
键入sqlite3 BookStore.db:
然后键入:.table: