升级SQLite数据库最佳写法

前端之家收集整理的这篇文章主要介绍了升级SQLite数据库最佳写法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

sqlite简介

sqlite是android中内置的一款轻量级的关系型数据库支持标准的sql语法,还遵循数据库的ACID事务。

如何创建数据库

Android为了让我们能够更加方便的管理数据库,专门提供了一个sqliteOpenHelper帮助类,借助这个类就可以非常简单的对数据库进行创建和升级。我们可以自己创建一个类去继承它。sqliteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须要在自己定义的类中重写这两个方法,然后分别在这个两个方法中创建、升级数据库的逻辑。

方法参数分析

public MyDataBaseHelper(Context context,String name,sqliteDatabase.CursorFactory factory,int version)
    {
        super(context,name,factory,version);
    }

    @Override
    public void onCreate(sqliteDatabase db) {
    }

    @Override
    public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {
        }

sqliteOpenHelper中有两个构造方法,一般使用参数少的构造方法即可。
context:应用程序环境的信息,即上下文
name:数据库名称
factory:允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null
version:当前数据库的版本号
构建出sqliteOpenHelper的实例后,再调用它的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库了。

具体实例

-创建自定义类,继承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,version);
        mcontext=context;
    }

    @Override
    public void onCreate(sqliteDatabase db) {
        db.execsql(CREATE_BOOK);
    }

    @Override
    public void onUpgrade(sqliteDatabase db,int newVersion) {
        switch (oldVersion) {
            case 1:
                db.execsql(CREATE_CATEGORY);
            case 2:
                db.execsql("alter table Book add column category_id integer");
                default:

        }

    }
}

-新建布局文件,在布局文件添加一个按钮即可。
-在MainActivity中实现点击按钮,创建数据库和表的逻辑。

public class MainActivity extends Activity {
   priavte MyDatabaseHelper dbHelper;
   @override
   protected void onCreate(Bundle savedInstanceState)
   {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     dbHelper=new MyDatabaseHelper(this,"BookStore.db",null,1);
     Button createDatabase=(Button)findViewById(R.id.create_database);
     createDatabase.setOnClickListener(new OnClickListener(){
     @override
     public void onClick(View v)
     {
     dbHelper.getWritableDatabase();
     }
     });
   }
}

首先在onCreate()方法中构建一个MyDatabaseHelper对象,并且通过构造函数的参数将数据库名指定为BookStore.db,版本号为1,点击界面上的按钮,调用getWritableDatabase()方法
执行的逻辑如下:
点击按钮时,它首先会检测程序中是否有BookStore.db数据库。如果没有,就会创建数据库调用MyDatabaseHelper中的onCreate()方法。这样表book就会被创建。当第二次点击按钮时,则MyDatabaseHelper中的onCreate()就不会执行了,因为数据库已存在,且也不会创建表。

如何升级数据库呢?

onUpgrade()方法是用于对数据库进行升级的。
假如现在要在数据库添加一个CATEGORY的表,如何在上述程序上修改呢?
直接在onCreate()方法添加创建语句是不行的,因为数据库已经存在,OnCreate()方法不会被运行了。那最基础的办法是,我们传入一个高一点的版本号,在onUpgrade运行删除数据库的操作,在点击按钮就可以运行OnCreate()方法了。
传入一个高一点的版本号,就可以让onUpgrade()方法执行

public class MyDataBaseHelper extends sqliteOpenHelper {
    public static final String CREATE_BOOK="create table book("
            +"id integer primary key autoincrement,"
            +"name text,"
            +"category_id integer)";

    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,version);
        mContext=context;
    }

    @Override
    public void onCreate(sqliteDatabase db) {
        db.execsql(CREATE_BOOK);
        db.execsql(CREATE_CATEGORY);
    }

    @Override
    public void onUpgrade(sqliteDatabase db,int newVersion) {
      db.execsql("drop table if exists Book");
      db.execsql("drop table if exists Category");
      onCreate(db);
        }
    }
}

升级数据库的最佳写法

上面的升级数据库方法是不可取的,因为在现实应用中,数据库包含重要的历史数据,如果全部删除,后果不堪设想。
我们可以这样设想:
每个数据库升级的时候都会对应一个版本号,当指定的数据库版本号大于当前数据库版本号的时候,就会进行到onUpgrade()方法中去执行更新操作。这里只需要为每一个版本号赋予它各自的更改的内容,然后在onUpgrade()方法中对当前数据库的版本号进行判断,再执行相应的改变就可以了。

public class MyDataBaseHelper extends sqliteOpenHelper {
    public static final String CREATE_BOOK="create table book("
            +"id integer primary key autoincrement,"
            +"category_code integer)";

    public MyDataBaseHelper(Context context,version);
    }

    @Override
    public void onCreate(sqliteDatabase db) {
        db.execsql(CREATE_BOOK);
    }

    @Override
    public void onUpgrade(sqliteDatabase db,int newVersion) {
        switch (oldVersion) {
            case 1:
                db.execsql(CREATE_CATEGORY);
            case 2:
                db.execsql("alter table Book add column category_id integer");
                default:

        }

    }
}

[1]:参考资料:第一行代码 Android

原文链接:https://www.f2er.com/sqlite/199428.html

猜你在找的Sqlite相关文章