2011-07-19 79 views
3

内SQLite的路径我开发一个应用程序,我碰到两个问题在这里:获取资产的文件夹

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

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

任何建议将不胜感激。

回答

1

this我发现this教程。它告诉你如何处理资产文件夹中的数据库。至少可以回答你的第一个问题。我不太确定你的第二。

3

我有同样的问题,所以我提出的分贝文件到RES /原始文件夹,并访问它像这样:

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

然后我试图将文件移动到/数据/数据/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)。

+1

为什么你必须将其从资产中复制出来?那么你正在浪费用户手机上的空间。 – Mark

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. 

} 
相关问题