获取Assets文件夹中的SQLite路径

时间:2011-07-19 17:57:47

标签: android sqlite android-sqlite android-assets

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

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

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

  3. 任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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)。

答案 1 :(得分:1)

this发帖后找到this教程。它告诉您如何处理assets文件夹中的数据库。这至少回答了你的第一个问题。我对你的第二个不太确定。

答案 2 :(得分: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.

 }