2013-03-14 117 views
1

在我的應用程序中,我必須從資產文件夾中檢索sqlite數據庫。但是當我這樣做,我會得到錯誤。從資產複製sqlite數據庫的錯誤

這是我用來複制從資產

public class DataBaseHelper extends SQLiteOpenHelper 
{ 
private static String TAG = "DataBaseHelper"; // Tag just for the LogCat window 
//destination path (location) of our database on device 
private static String DB_PATH = ""; 
private static String DB_NAME ="(student).sqlite";// Database name 
private SQLiteDatabase mDataBase; 
private final Context mContext; 

public DataBaseHelper(Context context) 
{ 
    super(context, DB_NAME, null, 1);// 1? its Database Version 
    DB_PATH = "/data/data/" + context.getPackageName() + "/databases/"; 
    Log.i(TAG, DB_PATH); 
    this.mContext = context; 
}  

public void createDataBase() throws IOException 
{ 
    //If database not exists copy it from the assets 

    boolean mDataBaseExist = checkDataBase(); 
    if(!mDataBaseExist) 
    { 
     this.getReadableDatabase(); 
     this.close(); 
     try 
     { 
      //Copy the database from assests 
      copyDataBase(); 
      Log.e(TAG, "createDatabase database created"); 
     } 
     catch (IOException mIOException) 
     { 
      throw new Error("ErrorCopyingDataBase"); 
     } 
    } 
} 
    //Check that the database exists here: /data/data/your package/databases/Da Name 
    private boolean checkDataBase() 
    { 
     File dbFile = new File(DB_PATH + DB_NAME); 
     //Log.v("dbFile", dbFile + " "+ dbFile.exists()); 
     return dbFile.exists(); 
    } 

    //Copy the database from assets 
    private void copyDataBase() throws IOException 
    { 
     InputStream mInput = mContext.getAssets().open(DB_NAME); 
     String outFileName = DB_PATH + DB_NAME; 
     OutputStream mOutput = new FileOutputStream(outFileName); 
     byte[] mBuffer = new byte[1024]; 
     int mLength; 
     while ((mLength = mInput.read(mBuffer))>0) 
     { 
      mOutput.write(mBuffer, 0, mLength); 
     } 
     mOutput.flush(); 
     mOutput.close(); 
     mInput.close(); 
    } 

    //Open the database, so we can query it 
    public boolean openDataBase() throws SQLException 
    { 
     String mPath = DB_PATH + DB_NAME; 
     //Log.v("mPath", mPath); 
     mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY); 
     //mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); 
     return mDataBase != null; 
    } 

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

    @Override 
    public void onCreate(SQLiteDatabase arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 

    } 

} 

調用數據庫編碼

public class TestAdapter { 
protected static final String TAG = "DataAdapter"; 

private Context mContext; 
public static SQLiteDatabase mDb; 
private DataBaseHelper mDbHelper; 
public static TestAdapter instance; 

public TestAdapter(Context context) { 
    this.mContext = context; 
    mDbHelper = new DataBaseHelper(mContext); 
    createDatabase(); 
    open(); 
} 

public static TestAdapter getTestAdaptor(Context context) { 
    if (instance == null) { 
     instance = new TestAdapter(context); 
     // createDatabase(); 
     // open(); 
    } 
    return instance; 
} 

private void createDatabase() throws SQLException { 
    try { 
     mDbHelper.createDataBase(); 
    } catch (IOException mIOException) { 
     Log.e(TAG, mIOException.toString() + " UnableToCreateDatabase"); 
     throw new Error("UnableToCreateDatabase"); 
    } 

} 

private void open() throws SQLException { 
    try { 
     mDbHelper.openDataBase(); 
     mDbHelper.close(); 
     mDb = mDbHelper.getReadableDatabase(); 
    } catch (SQLException mSQLException) { 
     Log.e(TAG, "open >>" + mSQLException.toString()); 
     throw mSQLException; 
    } 
} 

public void close() { 
    mDbHelper.close(); 
} 

數據庫這是我收到

03-14 10:18:03.731: E/AndroidRuntime(788): FATAL EXCEPTION: main 
03-14 10:18:03.731: E/AndroidRuntime(788): java.lang.Error: ErrorCopyingDataBase 
03-14 10:18:03.731: E/AndroidRuntime(788): at com.example.voicereg.DataBaseHelper.createDataBase(DataBaseHelper.java:49) 
03-14 10:18:03.731: E/AndroidRuntime(788): at com.example.voicereg.TestAdapter.createDatabase(TestAdapter.java:38) 
03-14 10:18:03.731: E/AndroidRuntime(788): at com.example.voicereg.TestAdapter.<init>(TestAdapter.java:23) 
03-14 10:18:03.731: E/AndroidRuntime(788): at com.example.voicereg.TestAdapter.getTestAdaptor(TestAdapter.java:29) 
03-14 10:18:03.731: E/AndroidRuntime(788): at com.example.voicereg.VoiceActivity.onOptionsItemSelected(VoiceActivity.java:186) 
03-14 10:18:03.731: E/AndroidRuntime(788): at android.app.Activity.onMenuItemSelected(Activity.java:2502) 
03-14 10:18:03.731: E/AndroidRuntime(788): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:950) 
03-14 10:18:03.731: E/AndroidRuntime(788): at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735) 
03-14 10:18:03.731: E/AndroidRuntime(788): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149) 
03-14 10:18:03.731: E/AndroidRuntime(788): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 
03-14 10:18:03.731: E/AndroidRuntime(788): at com.android.internal.view.menu.ListMenuPresenter.onItemClick(ListMenuPresenter.java:163) 
03-14 10:18:03.731: E/AndroidRuntime(788): at android.widget.AdapterView.performItemClick(AdapterView.java:292) 
03-14 10:18:03.731: E/AndroidRuntime(788): at android.widget.AbsListView.performItemClick(AbsListView.java:1058) 
03-14 10:18:03.731: E/AndroidRuntime(788): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514) 
03-14 10:18:03.731: E/AndroidRuntime(788): at android.widget.AbsListView$1.run(AbsListView.java:3168) 
03-14 10:18:03.731: E/AndroidRuntime(788): at android.os.Handler.handleCallback(Handler.java:605) 
03-14 10:18:03.731: E/AndroidRuntime(788): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-14 10:18:03.731: E/AndroidRuntime(788): at android.os.Looper.loop(Looper.java:137) 
03-14 10:18:03.731: E/AndroidRuntime(788): at android.app.ActivityThread.main(ActivityThread.java:4424) 
03-14 10:18:03.731: E/AndroidRuntime(788): at java.lang.reflect.Method.invokeNative(Native Method) 
03-14 10:18:03.731: E/AndroidRuntime(788): at java.lang.reflect.Method.invoke(Method.java:511) 
03-14 10:18:03.731: E/AndroidRuntime(788): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
03-14 10:18:03.731: E/AndroidRuntime(788): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
03-14 10:18:03.731: E/AndroidRuntime(788): at dalvik.system.NativeStart.main(Native Method) 

可以在任何錯誤編碼一個幫助我在編碼部分做了什麼錯誤

+0

時,拋出IOException異常可能包含重要信息。你可以在你拋出錯誤之前記錄它(順便說一句,應該是一個Exception)。 – Henry 2013-03-14 05:22:51

+0

我嘗試把異常現在我得到這個錯誤android.database.sqlite.SQLiteException:沒有這樣的表:stddetails:,而編譯時:從stddetails選擇phoneno當前='沒有' – Jagan 2013-03-14 09:04:38

+0

但數據庫中有任何表stddetails任何幫助 – Jagan 2013-03-14 09:05:09

回答

0

在的CreateDatabase關閉數據庫,所以你不能複製

this.getReadableDatabase(); 
    this.close(); 

應該只是

this.getReadableDatabase(); 
+0

我嘗試這個,直到我得到相同的錯誤 – Jagan 2013-03-14 05:44:38

相關問題