2011-07-19 122 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. 

} 
相關問題