Android入门(十)SQLite创建升级数据库

原文链接:http://www.orlion.ga/603/

平等、创建数据库

    Android为了吃咱们会进一步有益于地管理数据库,专门供了一个
SQLiteOpenHelper帮助类,
借助这个近乎就足以非常简单地对准数据库进行创办与升级。

   
SQLiteOpenHelper是一个抽象类,其中有星星点点只抽象方法分别是onCreate()和onUpgrade(),分别以即时有限个措施吃实现创建和晋升数据库的逻辑

   
SQLiteOpenHelper还有两独好第一之实例方法,getReadableDatabase()和getWritableDatabase()。这片单道都得创造或者打开一个现有的数据库(如果数据库已经在则直打开,如果未设有则开创一个),并返回一个只是对数据库进行读写操作的目标。不同的凡,当数据库不可写副的早晚(如磁盘空间已满)getReadableDatabase()方法返回的目标将因为只念之法门去开辟数据库,而getWritableDatabase()将废弃来深。

   
SQLiteOpenHelper中起有限独构造方法可以重写,一般采用参数少之要命构造方法即可。这个构造方法接收四单参数,第一只是Context
。第二只凡是数量库名。第三独参数允许我们以询问数据的时段回来一个自定义的Cursor,一般还是传null。第四只参数是时下数据库的本号,可用来对数据库进行升级换代操作。构建出SQLiteOpenHelper的实例之后,再调用它的getReadableDatabase()或getWritableDatabase()方法就会创立数据库了,数据库文件会满怀放在/data/data/<package
name>/databases/目录下。此时重写的onCreate()方法为会见赢得实施,所以一般会于此失去处理部分创建表的逻辑。

    

   
创建一个品类DatabaseDemo,新建MyDatabaseHelper类从SQLiteOpenHelper继承:

package ga.orlion.databasedemo;

 

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

import android.widget.Toast;

import android.database.sqlite.SQLiteOpenHelper;

 

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)”;

 

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, “数据库创建了”,
Toast.LENGTH_SHORT).show();

}

 

@Override

public void onUpgrade(SQLiteDatabase db,
int oldVersion, int newVersion) {

 

}

 

}

    其中建表语句: 

create table Book (

    id integer primary key autoincrement,

    author text,

    price real,

    pages integer,

    name text)

    SQLite不像另的数据库有不少无规律的数据类型, 它的数据类型很简短,
integer表示整型,real代表浮点型,text表示文本类,blob表示二上前制类型。另外,上述建表语句被我们尚运用了
primary key将 id列设为主键,并就此 autoincrement关键字表示
id列是由增长的。

    我们把建筑表语句定义成了一个字符串常量,然后以
onCreate()方法中同时调用了 SQLiteDatabase的
execSQL()方法去实践就条砌表语句,并弹来一个 Toast提示创建成功。

    修改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=”创建数据库” />

</LinearLayout>

    布局文件特别粗略,就是参加了一个按钮,用于创造数据库。最后修改
MainActivity中的代码:

                super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

dbHelper = new MyDatabaseHelper(this , “BookStore.db” , null , 1);

Button button = (Button)
findViewById(R.id.create_database);

button.setOnClickListener(new
View.OnClickListener() {

 

@Override

public void onClick(View v) {

dbHelper.getWritableDatabase();

}

});

    这里我们于 onCreate()方法吃构建了一个
MyDatabaseHelper对象,并且经过构造函数的参数将数据库名指定为
BookStore.db,版本号指定为 1,然后在 Create
database按钮的点击事件里调用了getWritableDatabase()方法。这样当第一赖点击Create
database按钮时,就见面检测到目前程序中并不曾BookStore.db这个数据库,
于是碰头创造该数据库并调用MyDatabaseHelper中之 onCreate()方法,这样
Book表也即赢得了创建,然后会弹有一个 Toast提示创建成功。再次点击 Create
database按钮时,会发觉这都有
BookStore.db数据库了,因此无会见更创同次等。

    

    接下去我们采取adb
shell来对数据库和表的创导情况进行查看,adb工具在Android
SDK中自带,这个家伙得以对连续在计算机上的手机或者模拟器进行调剂操作,它存放于sdk的platform-tools目录下。先拿之目录上加至环境变量中。然后控制台中输入
“adb
shell”,然后使用”cd”命令进入/data/data/ga.orlion.databasedemo/databases/目录下,使用ls查看有文件会看到有少个文件,一个凡是我们创建的BookStore.db,另一个BookStore.db-journal则是以数据库能够支持工作而发出的现日志文件,通常情况下该公文之大大小小是0。接下来我们通过sqlite3发令打开数据库,只待输入sqlite3后止和达到数库名即可。这时就开辟BookStore.db数据库了,现在虽得本着斯数据库的阐发进行保管了,可以透过”.table”命令来查看有哪表

,此时发生个别个说明,android_meatdata是每个数据库都见面自动生成的,另外一个表book是我们创建的。还可以通过”.schema”命令来查他们的建表语句。

    

亚、升级数据库

   
如果我们怀念再补充加一个表到我们创建的数据库BookStore.db中未可知如创建第一独表book时那么简单的状及oncreate方法被了,因为我们的数据库都创造了,onCreate()不见面再次实施了,所以便因故到了onUpgrade()方法。

    可以将MyDatabaseHelper改为:

package ga.orlion.databasedemo;

 

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

import android.widget.Toast;

import android.database.sqlite.SQLiteOpenHelper;

 

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, “数据库创建了”,
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);

}

 

}

    

    可以望,我们于 onUpgrade()方法被执了个别长条
DROP语词,如果发现数据库中已经是 Book表或
Category表了,就以立刻片摆设表删除掉,然后重新调用
onCreate()方法去又创设。这里先拿已经有的表删除掉,是盖要是当开立表时发现立即张表已经存在了,就见面一直报错。

    接下去就是是被
onUpgrade()方法能推行了,SQLiteOpenHelper的构造方法里接纳的季独参数为?它意味着目前数据库的版号,现在如传入一个比
1生之频繁, 就可叫 onUpgrade()方法获得推行了。

dbHelper = new MyDatabaseHelper(this , “BookStore.db” , null , 2);

网站地图xml地图