3

我正在开发一个应用程序,我在这里遇到了两个问题:

  1. 如何打开存储在 assets 文件夹中的 SQLite 数据库?我使用什么路径来访问应用程序中的资产文件夹?这是我到目前为止所拥有的:

    path = "file:///asset_folder/database.dat";
    SQLiteDatabase db = null;
    db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
    
  2. /data/data/...在我的应用程序安装期间或首次运行期间,如何将文件复制到内部存储器 ( )?我想在第一次运行时将 assets 文件夹中的文件夹复制到内部存储器中。

任何建议将不胜感激。

4

3 回答 3

2

我遇到了同样的问题,所以我将 db 文件移动到 res/raw 文件夹,并像这样访问它:

InputStream inputStream = getBaseContext().getResources().openRawResource(R.raw.mySQLiteFile);

然后我尝试将文件移动到 /data/data/com.mydomain.www/databases/ 文件夹中,但我会得到一个异常,因为目标路径不存在,所以我做了File(destPath).getParentFile().mkdir();

从那里,我调用了一个复制数据库方法将数据库传输到目的地。

public void CopyDB(InputStream inputStream, OutputStream outputStream) throws IOException {
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, length);
        }
        inputStream.close();
        outputStream.close();
    }

InputStream 是 db 文件,OutputStream 是 FileOutputStream(destPath)。

于 2011-07-25T16:00:11.287 回答
1

将数据库从 assets 文件夹复制到应用程序的 data/data/database 文件夹。使用下面的代码。

import java.io.FileNotFoundException;
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.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class DataBaseHelper1 extends SQLiteOpenHelper{

//The Android's default system path of your application database.
public static String DB_PATH = "/data/data/com.XXX.XXX/databases/";
private static String DB_NAME = "india.sqlite";
private static String DB_NAME_MY = "india.sqlite";
private SQLiteDatabase myDataBase; 
private final Context myContext;

/**
 * Constructor
 * Takes and keeps a reference of the passed context in order to access to the  application assets and resources.
 * @param context
 */

public DataBaseHelper1(Context context){
    super(context, DB_NAME, null, 1);
    this.myContext = context;
 }  

/**
 * Creates a empty database on the system and rewrites it with your own database.
 * */
public void createDataBase() throws IOException{
    // for first database;
    boolean dbExist = checkDataBase(DB_NAME);
    if(!dbExist){
        try {
            copyDataBase(DB_NAME_MY,DB_NAME);
        } catch (Exception e) {
            throw new Error("Error copying database");
        }
    }
}

/**
 * Check if the database already exist to avoid re-copying the file each time you open the application.
 * @return true if it exists, false if it doesn't
 */
private boolean checkDataBase(String DB){
    SQLiteDatabase checkDB = null;
    try{
        String myPath = DB_PATH + DB;
        checkDB = SQLiteDatabase.openDatabase(myPath, null,  SQLiteDatabase.OPEN_READONLY);

    }catch(SQLiteException e){}

    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(String assetfile,String DB) {

    //Open your local db as the input stream
    InputStream myInput = null;
    //Open the empty db as the output stream
    OutputStream myOutput = null;
    try {
        myInput = myContext.getAssets().open(assetfile);

        // Path to the just created empty db
        String outFileName = DB_PATH + DB;

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


        System.out.println("***************************************");
        System.out.println("####### Data base copied ##############");
        System.out.println("***************************************");


    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
     }
          finally{
          //Close the streams
          try {
        myOutput.flush();
        myOutput.close();
        myInput.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 }

}

public void openDataBase() {

    try {
        //Open the database
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

@Override
public synchronized void close() {

        if(myDataBase != null)
            myDataBase.close();

        super.close();

}

@Override
public void onCreate(SQLiteDatabase db) {

}

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

}

    // Add your public helper methods to access and get content from the database.
   // You could return cursors by doing "return myDataBase.query(....)" so it'd be easy
   // to you to create adapters for your views.

 }
于 2011-09-27T05:35:39.117 回答
1

这篇文章中我找到了这个教程。它告诉您如何处理资产文件夹中的数据库。这至少回答了你的第一个问题。我不太确定你的第二个。

于 2011-07-19T18:58:26.497 回答