2014-02-10 56 views
0

我已經看過有關包括預填充的sqlite數據庫的文章,但我仍然收到錯誤。這裏是我的數據庫Helper類:不能在Android項目中包含預填充的sqlitedatabase

public class MyDBHelper extends SQLiteOpenHelper { 

private static MyDBHelper mInstance = null; 
private static final int DB_VERSION = 5; 
private static final String DB_NAME = "database.sqlite"; 
static final String TABLE_NAME = "PRODUCTS"; 
private final Context mContext; 
private static SQLiteDatabase myWritableDb; 
private static final String DATABASE_PATH = "/data/data/com.example.barcodescanner/databases/"; 

public static MyDBHelper getInstance(Context ctx) { 
    if (mInstance == null) { 
     mInstance = new MyDBHelper(ctx.getApplicationContext()); 
    } 
    return mInstance; 
} 

private MyDBHelper(Context context) { 
    super(context, DB_NAME, null, DB_VERSION); 
    this.mContext = context; 
} 

@Override 
public void onCreate(SQLiteDatabase sqLiteDatabase) { 

} 

public void createDatabase() throws IOException { 
    createDB(); 
} 

private void createDB() throws IOException { 

    boolean dbExist = DBExists(); 
    if (!dbExist) { 
     this.getReadableDatabase(); 
     copyDBFromResource(); 
    } 

} 

private boolean DBExists() { 
    File dbFile = new File(DATABASE_PATH + DB_NAME); 
    return dbFile.exists(); 
} 

private void copyDBFromResource() throws IOException { 
    InputStream inputStream = null; 
    OutputStream outStream = null; 
    String dbFilePath = DATABASE_PATH + DB_NAME; 

    try { 
     inputStream = mContext.getAssets().open(DB_NAME); 
     outStream = new FileOutputStream(dbFilePath); 

     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = inputStream.read(buffer)) > 0) { 
      outStream.write(buffer, 0, length); 
     } 

     outStream.flush(); 
     outStream.close(); 
     inputStream.close(); 
    } catch (Exception ex) { 
     System.out.println(ex.getMessage()); 
    } 
} 


@Override 
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, 
     int newVersion) { 
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
    onCreate(sqLiteDatabase); 
} 


} 

我創建像數據庫中的以下內容:

public MyDBHelper helper = MyDBHelper.getInstance(this);   
helper.createDatabase(); 

的問題是,在copyDBFromResource功能,在下面一行:

outStream = new FileOutputStream(dbFilePath); 

我得到一個異常說

java.io.FileNotFoundException: /data/data/com.example.barcodescanner/databases/database.sqlite: open failed: ENOENT (No such file or directory) 

我在做什麼錯?我的DATABASE_PATH變量中的軟件包名稱是MainActivity所在的軟件包名稱。那是錯的嗎?任何人都可以幫我解決它嗎?

感謝

+1

如果你**擺脫**的DATABASE_PATH怎麼辦?這個對我有用。 –

+0

請使用'SQLiteAssetHelper'打包數據庫,以便與您的應用程序一起分發:https://github.com/jgilfelt/android-sqlite-asset-helper – CommonsWare

回答

1

如果你正試圖從另一個應用程序訪問數據庫,你應該知道,應用程序可以從內部存儲器只能訪問自己的文件,所以從您的應用程序,你不能從另一個應用程序訪問數據庫。但是,您可以訪問其他應用程序的文件,如果它們位於「外部」存儲:

Android Training: Saving Files

內部存儲:

  • 它總是可用。
  • 此處保存的文件默認只能由您的應用訪問。
  • 當用戶卸載您的應用程序時,系統會從內部存儲中刪除所有應用程序的文件。

更新:

如上文的評論中提到,你不需要提供路徑應用程序的DB(你不必直接訪問文件),你需要只在你的MyDBHelper類的構造函數中提供數據庫名(你所做的)。我建議看看here,在我看來,很好地解釋瞭如何在Android中使用數據庫。

0
  • 的應用程序私有文件
  • 使用context.getPackageName()每當你需要包括一個包名

數據庫路徑都不應鐵桿路徑。

final File databaseFile = context.getDatabasePath(DB_NAME); 
相關問題