解读郭神LitePal源码-数据库的创建以及如何修改源码来创建外置数据库

在解析完litepal.xml之后,就可以通过LitePalAttr类的对象获取到数据库名,版本号以及所有有数据库映射关系的对象的类名。得到这些基本信息可以用来创建数据库和表。先只讨论数据库的创建以及怎样修改源码进行外置数据库的创建,表创建和关联关系的设置下篇再说。由于SQLite的数据库创建默认路径是data/data/程序包名/database,所以应用程序一旦被卸载,数据库也就随之消失。如果现在丢过来一个需求,要求数据不随着应用程序的卸载而丢失,除非人为手动进入到文件管理去删除之,否则一定要确保数据不被任何其他因素删除,该怎么做呢?前面已经提到外置数据库,更改数据库创建的路径,放到sd卡上去,应用程序的生死再也不会连累数据库啦。


先看数据库的创建吧^o^


还是一样跟着郭神的源码动手去写下,先去建项目去.....

一、数据库的创建

回来...这里先要回顾下使用SQLite去创建数据库的写法:

public class DictionaryOpenHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 2;
    private static final String DICTIONARY_TABLE_NAME = "dictionary";
    private static final String DICTIONARY_TABLE_CREATE =
                "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
                KEY_WORD + " TEXT, " +
                KEY_DEFINITION + " TEXT);";

    DictionaryOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DICTIONARY_TABLE_CREATE);
    }
}
要创建一个新的SQLite数据库,首先要创建一个子类去继承SQLiteOpenHelper,SQLiteOpenHelper是管理数据库创建和版本控制的帮助类。子类的作用主要是为了去具体实现SQLiteOpenHelper中定义的几个抽象方法——onCreate(),onUpgrade()。(PS:典型的Template Method模板方法——SQLiteOpenHelper父类中定义某些特定的步骤即算法不变的部分,将可变的部分留给子类。)我们只有调用了getWriteableDatabase()或者getReadableDatabase()方法,数据库才会被真正地创建:

DictionaryOpenHelper helper = new DictionaryOpenHelper();
helper.getWritableDatabase();

getWriteableDatabase()里调用了getDatabaseLocked(),SQLiteOpenHelper的核心工作就在这个方法里。


遵循SQLite数据库的创建方法,LitePal创建了一个LitePalOpenHelper去继承SQLiteOpenHelper(),通过构造函数,传递数据库名以及版本号。通过上一篇litepal.xml的解析已经将基本配置信息存储到LitePalAttr类中,所以通过LitePalAttr对象把版本号及数据库名传递给LitePalOpenHelper构造函数。具体看Connector类的实现:

Connector类的作用就是触发创建数据库来获取数据库的实例对象。我们也看到了触发litepal.xml解析的时机!

package com.aliao.litepal.tablemanager;

import android.database.sqlite.SQLiteDatabase;

import com.aliao.litepal.exceptions.InvalidAttributesException;
import com.aliao.litepal.parser.LitePalAttr;
import com.aliao.litepal.parser.LitePalParser;

/**
 * Created by 丽双 on 2015/6/9.
 * 通过该类去连接数据库,使用该得到数据库的实例对象
 */
public class Connector {

    private static LitePalAttr mLitePalAttr;
    
    private static LitePalOpenHelper mLitePalHelper;

    public static SQLiteDatabase getDatabase(){
        return getWriteDatabase();
    }
    
    public synchronized static SQLiteDatabase getWriteDatabase(){
        LitePalOpenHelper openHelper = buildConnection();
        return openHelper.getWritableDatabase();
    }

    /**
     * 1.启动对litepal.xml的解析
     * 2.创建LitePalOpenHelper实例对象
     * @return
     */
    private static LitePalOpenHelper buildConnection() {
        if (mLitePalAttr == null){
            LitePalParser.parseLitePalConfiguration();
            mLitePalAttr = LitePalAttr.getIntance();
        }
        if (mLitePalAttr.checkSelfValid()){
            if (mLitePalHelper == null){
                mLitePalHelper = new LitePalOpenHelper(mLitePalAttr.getDbName(), mLitePalAttr.getVersion());
            }
            return mLitePalHelper;
        }else {
            throw new InvalidAttributesException("Uncaught invalid attributes exception happened");   
        }
    }


}


LitePalOpenHelper类:

package com.aliao.litepal.tablemanager;

import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import com.aliao.litepal.LitePalApplication;

/**
 * Created by 丽双 on 2015/6/9.
 */
public class LitePalOpenHelper extends SQLiteOpenHelper{

    public LitePalOpenHelper(String name,int version) {
        //将数据库名及版本号传给父类SQLiteOpenHelper
        super(LitePalApplication.getContext(), name, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}
Litepal数据库的创建并没什么特别的地方,唯一不同的就在于数据库名和版本的获取上。以往我们在SQLiteOpenHelper的子类里直接定义:

public class DBOpenHelper extends SQLiteOpenHelper {

	// 数据库版本
	public final static int DB_VERSION = 1;
	// 数据库名
	public final static String DB_NAME = "questionnair.db";
  
	private Context mContext;

	public DBHelper(Context context) {
	<span style="white-space:pre">	</span>super(context, DB_NAME, null, DB_VERSION);
	}
}
而在LitePal里需要先解析配置文件litepal.xml去获取数据库基本信息。

运行项目,检查数据库是否被创建了,进入Android Device Monitor->File Explorer->data->data->程序包名下看到数据库已经创建成功

解读郭神LitePal源码-数据库的创建以及如何修改源码来创建外置数据库_第1张图片



二、外置数据库的创建

1.创建外置数据库有哪些优缺点

    优点:1.可以直接访问,不会受到手机Root权限的限制

2.不会有像内置数据库会面临手机本身存储空间小对数据库大小的限制问题

3.不会随着App的卸载而被删除 

    缺点:任何人都可以访问该数据库,数据库的信息对外是暴露的


2.创建外置数据库的思路

    数据库的默认创建路径在app的内部存储中——data/data/包名/databases/下,想要将数据库创建到sd卡上,其实就是更改数据库创建的路径。路径怎么更改,是不是在数据库创建之前有路径传递的参数可以设置?去debug源码看看

   

3.创建外置数据库的实现





你可能感兴趣的:(解读郭神LitePal源码-数据库的创建以及如何修改源码来创建外置数据库)