首先使用sqliteadDev(一个windows下图形化sqlite工具)建立一个新数据库。

android中使用sqlite、复制assets下的数据库到SD卡、支持大于1M的文件

如果使用SD卡,需要在AndroidManifest.xml中设置权限

   < uses-permission android:name ="android.permission.WRITE_EXTERNAL_STORAGE" ></ uses-permission >   < uses-permission android:name ="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" ></ uses-permission >  

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

import android.database.sqlite.SQLiteException;

import android.database.sqlite.SQLiteOpenHelper;

/**

* DBHelper dbHelper = new DBHelper(this);

* dbHelper.createDataBase();

* SQLiteDatabase db = dbHelper.getWritableDatabase();

* Cursor cursor = db.query()

* db.execSQL(sqlString);

* 注意:execSQL不支持带;的多条SQL语句,只能一条一条的执行,晕了很久才明白

* 见execSQL的源码注释 (Multiple statements separated by ;s are not supported.)

* 将把assets下的数据库文件直接复制到DB_PATH,但数据库文件大小限制在1M以下

* 如果有超过1M的大文件,则需要先分割为N个小文件,然后使用copyBigDatabase()替换copyDatabase()

*/

public class DBHelper extends SQLiteOpenHelper {

//用户数据库文件的版本

private static final int DB_VERSION = 1;

//数据库文件目标存放路径为系统默认位置,cn.arthur.examples 是你的包名

private static String DB_PATH = "/data/data/cn.fn/databases/";

/*

//如果你想把数据库文件存放在SD卡的话

private static String DB_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath()

+ "/arthurcn/drivertest/packfiles/";

*/

private static String DB_NAME = "hello.db";

private static String ASSETS_NAME = "hello.db";

private SQLiteDatabase myDataBase = null;

private final Context myContext;

/**

* 如果数据库文件较大,使用FileSplit分割为小于1M的小文件

* 此例中分割为 hello.db.101 hello.db.102 hello.db.103

*/

//第一个文件名后缀

private static final int ASSETS_SUFFIX_BEGIN = 101;

//最后一个文件名后缀

private static final int ASSETS_SUFFIX_END = 103;

/**

* 在SQLiteOpenHelper的子类当中,必须有该构造函数

* @param context 上下文对象

* @param name 数据库名称

* @param factory 一般都是null

* @param version 当前数据库的版本,值必须是整数并且是递增的状态

*/

public DBHelper(Context context, String name, CursorFactory factory, int version) {

//必须通过super调用父类当中的构造函数

super(context, name, null, version);

this.myContext = context;

}

public DBHelper(Context context, String name, int version){

this(context,name,null,version);

}

public DBHelper(Context context, String name){

this(context,name,DB_VERSION);

}

public DBHelper (Context context) {

this(context, DB_PATH + DB_NAME);

}

public void createDataBase() throws IOException{

boolean dbExist = checkDataBase();

if(dbExist){

//数据库已存在,do nothing.

}else{

//创建数据库

try {

File dir = new File(DB_PATH);

if(!dir.exists()){

dir.mkdirs();

}

File dbf = new File(DB_PATH + DB_NAME);

if(dbf.exists()){

dbf.delete();

}

SQLiteDatabase.openOrCreateDatabase(dbf, null);

// 复制asseets中的db文件到DB_PATH下

copyDataBase();

} catch (IOException e) {

throw new Error("数据库创建失败");

}

}

}

//检查数据库是否有效

private boolean checkDataBase(){

SQLiteDatabase checkDB = null;

String myPath = DB_PATH + DB_NAME;

try{

checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

}catch(SQLiteException e){

//database does't exist yet.

}

if(checkDB != null){

checkDB.close();

}

return checkDB != null ? true : false;

}

/**

* Copies your database from your local assets-folder to the just created empty database in the

* system folder, from where it can be accessed and handled.

* This is done by transfering bytestream.

* */

private void copyDataBase() throws IOException{

//Open your local db as the input stream

InputStream myInput = myContext.getAssets().open(ASSETS_NAME);

// Path to the just created empty db

String outFileName = DB_PATH + DB_NAME;

//Open the empty db as the output stream

OutputStream myOutput = new FileOutputStream(outFileName);

//transfer bytes from the inputfile to the outputfile

byte[] buffer = new byte[1024];

int length;

while ((length = myInput.read(buffer))>0){

myOutput.write(buffer, 0, length);

}

//Close the streams

myOutput.flush();

myOutput.close();

myInput.close();

}

//复制assets下的大数据库文件时用这个

private void copyBigDataBase() throws IOException{

InputStream myInput;

String outFileName = DB_PATH + DB_NAME;

OutputStream myOutput = new FileOutputStream(outFileName);

for (int i = ASSETS_SUFFIX_BEGIN; i < ASSETS_SUFFIX_END+1; i++) {

myInput = myContext.getAssets().open(ASSETS_NAME + "." + i);

byte[] buffer = new byte[1024];

int length;

while ((length = myInput.read(buffer))>0){

myOutput.write(buffer, 0, length);

}

myOutput.flush();

myInput.close();

}

myOutput.close();

}

@Override

public synchronized void close() {

if(myDataBase != null){

myDataBase.close();

}

super.close();

}

/**

* 该函数是在第一次创建的时候执行,

* 实际上是第一次得到SQLiteDatabase对象的时候才会调用这个方法

*/

@Override

public void onCreate(SQLiteDatabase db) {

}

/**

* 数据库表结构有变化时采用

*/

@Override

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

}

}

转自:http://www.cnblogs.com/som5/archive/2011/01/23/android_sqlite_assets_sdcard.html

更多相关文章

  1. 箭头函数的基础使用
  2. NPM 和webpack 的基础使用
  3. Python list sort方法的具体使用
  4. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  5. android 使用html5作布局文件: webview跟javascript交互
  6. Android系统配置数据库注释(settings.db)
  7. Android(安卓)Resource介绍和使用
  8. "Failed to fetch URL https://dl-ssl.google.com/android/repos
  9. 使用NetBeans搭建Android开发环境

随机推荐

  1. Android(安卓)Canvas 旋转Rect功能实施
  2. Android(安卓)浏览器插件开发-插件库
  3. Android(安卓)xUtils3源码解析之注解模块
  4. android ANR 问题
  5. ubuntu下反翻译android apk
  6. 关于Android(安卓)properties 中ro开头无
  7. Android开发 之 图片浏览
  8. 一键多渠道打包 只需1秒
  9. Android自定义饼图TTJPieChart
  10. Android(安卓)- AppCompatEditText 重写,