在我们经常开发android程序的时候,为了提高我们的开发效率和方便程序的维护性,一般是会在sqlite expert professional等sqlite工具设计好之后,放在assets文件夹下或者在res文件夹下创建raw文件夹存放已经设计好的数据库文件。由于之前在做android开发程序中涉及到sqlite开发的时候,都是在程序中用sql语句创建表。所以觉得有点麻烦,但是我们可以类似于主流数据库一样实现设计好数据库,在android通过我们标准的java的IO流实现数据库文件的读写进而创建数据库中的表。但是我比较习惯于放在assets下读取已经设计好的数据库文件。下面来看看我的实现代码吧........
我们实现定义好一个关于数据库信息的常量类(DBConfigurationConstant):
package com.book.constant;
import android.os.Environment;
public class DBConfigurationConstant {
public static final String db_path="/data/data/com.book.activity/databases/";
public static final String db_name="book.db";
public static final String ASSETS_NAME="book.db";
public static final int DB_VERSION = 1;
public static int oldVersion = -1;
}
接着我们定义一个DBHelper,专门负责对android中的sqlite数据库的操作:
package com.book.db;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import com.book.activity.BookMainActivity;
import com.book.constant.DBConfigurationConstant;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBHelper extends SQLiteOpenHelper{
private Context mContext;//定义上下文
private SQLiteDatabase mydatabase;
public DBHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
mContext = context;
// TODO Auto-generated constructor stub
}
/**
* 用于创建数据库
*/
public DBHelper(Context context, String name,int version){
this(context, name, null, version);
}
public DBHelper(Context context, String name){
this(context,name,DBConfigurationConstant.DB_VERSION);
}
public DBHelper(Context context){
this(context,DBConfigurationConstant.db_path+DBConfigurationConstant.db_name);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
}
/**
* 数据库升级时调用
* */
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
/**
* 创建数据库中的表,我们只需调用这个函数就会实现在android中创建数据库和表,他的实质是通过java标准的文件流来实现
*/
public void createDatabase(){
try{
String databasePath=DBConfigurationConstant.db_path+DBConfigurationConstant.db_name;
Log.i("Other", "创建数据库"+databasePath);
File filedatabse=new File(databasePath);
Log.i("Other", "是否存在"+filedatabse.exists());
if(!filedatabse.exists()){
//赋值asseets中的数据库文件到DB_PATH下
filedatabse.getParentFile().mkdirs();
copyDataBase(databasePath);
}
}catch(Exception e){
e.printStackTrace();
}
}
public void copyDataBase(String dbfile) throws Exception{
InputStream ins=mContext.getAssets().open(DBConfigurationConstant.ASSETS_NAME);//得到放在assets文件夹下的已经创建好的数据库文件流
FileOutputStream fos=new FileOutputStream(dbfile);
byte[] buffer=new byte[1024];
int length;
while((length=ins.read(buffer))>0){//开始assets文件夹下的数据库文件写到android中下的
fos.write(buffer, 0, length);
}
mydatabase=SQLiteDatabase.openOrCreateDatabase(dbfile, null);
fos.flush();
fos.close();
ins.close();
}
}