2016-08-01 132 views
0

我有這個數據庫命名爲palavras.db複製從資產現有的數據庫文件夾內部數據庫文件夾錯誤

palavras.db

這是擺在我的res文件夾

inside res folder

而我使用這樣的數據庫:

public class UserListActivity extends AppCompatActivity { 

    /* As soon as this activity starts, it sets it's recycler view's adapter as 
    list of words from a result from a query */ 

    private RecyclerView mRecyclerView; 
    private RecyclerView.Adapter mAdapter; 
    private RecyclerView.LayoutManager mLayoutManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_user_list); 

    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview); 
    mRecyclerView.setHasFixedSize(true); 

    mLayoutManager = new LinearLayoutManager(this); 
    mRecyclerView.setLayoutManager(mLayoutManager); 

    Database db = new Database(getApplicationContext()); 
    List<Word> words = db.search(); 

    mAdapter = new WordAdapter(words); 
    mRecyclerView.setAdapter(mAdapter); 
    } 

數據庫類:

public class Database { 
    private SQLiteDatabase db; 
    private String tableName = "'PALAVRAS'"; 
    private DatabaseHelper databaseHelper; 

    public Database(Context context) { 
    databaseHelper = new DatabaseHelper(context); 
    databaseHelper.createDatabase(); 
    databaseHelper.openDatabase(); 
    } 

    public List<Word> search() { 
    return databaseHelper.search(tableName); 
    } 

數據庫輔助類:

public class DatabaseHelper extends SQLiteOpenHelper { 

    private String DB_PATH = ""; 
    private static final String DB_NAME = "palavras.db"; 
    private SQLiteDatabase mDatabase; 
    private final Context mContext; 

    public DatabaseHelper(Context context) { 
    super(context, DB_NAME, null, 1); 
    this.mContext = context; 
    this.DB_PATH = "/data/data/" + context.getPackageName() + "/" + "databases/"; 
    Log.d("porra", DB_PATH); 
    } 

    public void createDatabase() { 
    boolean dbExists = checkDatabase(); 
    if(dbExists) { 

    } else { 
     this.getReadableDatabase(); 
     try { 
     copyDatabase(); 
     } catch (IOException e) { 
     throw new Error("Error copying database"); 
     } 
    } 
    } 

    private boolean checkDatabase() { 
    SQLiteDatabase checkDB = null; 
    try { 
     String myPath = DB_PATH + DB_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
    } catch (SQLiteException e) { 

    } 
    if (checkDB != null) { 
     checkDB.close(); 
    } 
    return checkDB != null ? true : false; 
    } 

    private void copyDatabase() throws IOException { 
    InputStream myInput = mContext.getAssets().open(DB_NAME); 
    String outFileName = DB_PATH + DB_NAME; 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    byte[] buffer = new byte[10]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
     myOutput.write(buffer, 0, length); 
    } 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 
    } 

    public void openDatabase() throws SQLiteException { 
    String myPath = DB_PATH + DB_NAME; 
    mDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

    } 

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

    } 

    @Override 
    public synchronized void close() { 
    if (mDatabase != null) { 
     mDatabase.close(); 
    } 
    super.close(); 
    } 

    public List<Word> search(String tableName) { 
    List<Word> list = new ArrayList<Word>(); 
    String[] colunas = new String[]{"original", "traduzido"}; 

    Cursor c = mDatabase.rawQuery("SELECT * FROM "+tableName, null); 

    if (c.moveToFirst()) { 
     while (!c.isAfterLast()) { 
     Log.d("Porra", "Table Name=> "+c.getString(0)); 
     c.moveToNext(); 
     } 
    } 
    /* 
    Cursor cursor = db.query(tableName, colunas, null, null, null, null, "original ASC"); 

    if (cursor.getCount() > 0) { 
     cursor.moveToFirst(); 

     do { 
     Word w = new Word(); 
     w.setOriginal(cursor.getString(0)); 
     w.setTraduzido(cursor.getString(1)); 
     list.add(w); 
     } while(cursor.moveToNext()); 
    } 
    */ 
    // dbCore.close(); 
    return list; 
    } 

,我的每跑這裏是我所得到的:

08-01 19:20:45.723 4453-4453/app.visage.testesql E/SQLiteLog: (14) cannot open file at line 32456 of [bda77dda96] 08-01 19:20:45.723 4453-4453/app.visage.testesql E/SQLiteLog: (14) os_unix.c:32456: (2) open(/data/data/app.visage.testesql/databases/palavras.db) - 08-01 19:20:45.725 4453-4453/app.visage.testesql E/SQLiteDatabase: Failed to open database '/data/data/app.visage.testesql/databases/palavras.db'. android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:808) at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:793) at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:696) at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:671) at app.visage.testesql.database.DatabaseHelper.checkDatabase(DatabaseHelper.java:53) at app.visage.testesql.database.DatabaseHelper.createDatabase(DatabaseHelper.java:36) at app.visage.testesql.database.Database.(Database.java:27) at app.visage.testesql.activities.UserListActivity.onCreate(UserListActivity.java:32) at android.app.Activity.performCreate(Activity.java:6664) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 08-01 19:20:45.760 4453-4453/app.visage.testesql D/AndroidRuntime: Shutting down VM 08-01 19:20:45.761 4453-4453/app.visage.testesql E/AndroidRuntime: FATAL EXCEPTION: main Process: app.visage.testesql, PID: 4453 java.lang.Error: Error copying database at app.visage.testesql.database.DatabaseHelper.createDatabase(DatabaseHelper.java:44) at app.visage.testesql.database.Database.(Database.java:27) at app.visage.testesql.activities.UserListActivity.onCreate(UserListActivity.java:32) at android.app.Activity.performCreate(Activity.java:6664) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

無法複製數據庫未能打開它。

我的代碼有什麼問題,我不能只看到?

另外,當我瀏覽到我的數據庫文件夾,我看到它被複制在那裏!但不完全,表PALAVRAS不存在,只有android_metadata

回答

1

It is placed inside my res folder

這是行不通的,因爲你的文件不會成爲你的應用程序的一部分。您無法發明新的位置來將文件放入您的項目中,例如掛起res/

when i browse to my database folder I see it was copied there

不,它不是。

but not entirely, table PALAVRAS was not present, only android_metadata.

這是在您創建空數據庫時爲您創建的。

或者:

  1. Use SQLiteAssetHelper,它爲您提供了一個簡單的庫來替換大部分的代碼在你的問題

  2. 閱讀代碼複製並粘貼到你的項目,這表明原始數據庫正在從資產中複製

無論哪種情況,您的數據庫都將進入assets/目錄,而不是res/目錄。

相關問題