2014-09-23 43 views
0

我正面臨着SQLite數據庫的問題。它只是工作正常,但當我添加數據庫名稱的擴展名「.db」時,整個應用程序崩潰。它沒有建立任何數據庫。我想知道是否有人可以幫忙!我需要查看數據庫,但不能,除非它與擴展一起工作。當使用Sqlite數據庫和.db擴展名時,應用程序崩潰

public class DataBaseHelper extends SQLiteOpenHelper { 
private Context mycontext; 

private static String DB_NAME = "newsapp.db"; 
public SQLiteDatabase myDataBase; 
private String DB_PATH = "/data/data/" 
     + "com.news.mint" 
     + "/databases/"; 

public DataBaseHelper(Context context) throws IOException { 
    super(context, DB_NAME, null, 1); 
    this.mycontext = context; 
    boolean dbexist = checkdatabase(); 
    if (dbexist) { 

     opendatabase(); 
    } else { 

     createdatabase(); 
    } 
} 

public void createdatabase() throws IOException { 
    boolean dbexist = checkdatabase(); 
    if (dbexist) { 

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

private boolean checkdatabase() { 
    // SQLiteDatabase checkdb = null; 
    boolean checkdb = false; 
    try { 
     String myPath = DB_PATH + DB_NAME; 
     File dbfile = new File(myPath); 

     checkdb = dbfile.exists(); 
    } catch (SQLiteException e) { 

    } 
    return checkdb; 
} 

private void copydatabase() throws IOException { 
    // Open your local db as the input stream 
    InputStream myinput = mycontext.getAssets().open(DB_NAME); 

    // Path to the just created empty db 
    String outfilename = DB_PATH + DB_NAME; 

    // Open the empty db as the output stream 
    OutputStream myoutput = new FileOutputStream(outfilename); 

    // transfer byte to inputfile to outputfile 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myinput.read(buffer)) > 0) { 
     myoutput.write(buffer, 0, length); 
    } 

    // Close the streams 
    myoutput.flush(); 
    myoutput.close(); 
    myinput.close(); 
} 

public void opendatabase() throws SQLException { 
    // Open the database 
    String mypath = DB_PATH + DB_NAME; 
    myDataBase = SQLiteDatabase.openDatabase(mypath, null, 
      SQLiteDatabase.OPEN_READWRITE); 
} 

public synchronized void close() { 
    super.close(); 
    if (myDataBase != null) { 
     myDataBase.close(); 
    } 

} 

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

} 

@Override 
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { 
    // TODO Auto-generated method stub 

} 


} 

的logcat:

09-23 14:34:10.895: E/AndroidRuntime(7477): FATAL EXCEPTION: main 
09-23 14:34:10.895: E/AndroidRuntime(7477): android.database.sqlite.SQLiteException: no such table: primary_keywords (code 1): , while compiling: SELECT stock_Symbol from primary_keywords where stock_id = '22628' 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1013) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:624) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) 
09-23 14:34:10.895: E/AndroidRuntime(7477): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at com.newsmint.databasemanagementsystem.QueryManager.getDataLocal(QueryManager.java:36) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at com.newsmint.stockmint.NewsActivityFragment.init(NewsActivityFragment.java:74) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at com.newsmint.stockmint.NewsActivityFragment.onResume(NewsActivityFragment.java:147) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.support.v4.app.Fragment.performResume(Fragment.java:1543) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:963) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.os.Handler.handleCallback(Handler.java:615) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.os.Handler.dispatchMessage(Handler.java:92) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.os.Looper.loop(Looper.java:137) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at android.app.ActivityThread.main(ActivityThread.java:4921) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at java.lang.reflect.Method.invoke(Method.java:511) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 
09-23 14:34:10.895: E/AndroidRuntime(7477):  at dalvik.system.NativeStart.main(Native Method) 
09-23 14:56:47.185: E/SQLiteLog(7870): (1) no such table: top_news 
+0

你有沒有堆棧跟蹤? – 2014-09-23 09:29:11

+0

@MichaelAaronSafyan堆棧跟蹤添加! – addy123 2014-09-23 09:31:10

+0

使用私有靜態字符串DB_NAME =「newsapp.sqlite」; – Revathi 2014-09-23 09:37:20

回答

0

那麼新創建之前,它不與擴展解決這個問題,但是我很現在能夠使用Questoid sqlitebrowser查看數據庫,該數據庫適用於沒有擴展名的數據庫。

0
@Override 
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { 
    // TODO Auto-generated method stub 


    db.execSQL("DROP TABLE IF EXISTS " +"your table name"); 

} 
+0

我試過了,但不適用於任何擴展名:「newsapp.sqlite」或「newsapp.db」 – addy123 2014-09-23 09:39:58

+0

哪個錯誤火? – 2014-09-23 09:40:58

+0

錯誤說no_such_table。所以,可能是數據庫沒有加載到應用程序中,或者可能是路徑不準確/不可用。調試並檢查db是否被創建。 – Revathi 2014-09-23 09:43:17

0

我認爲當你第一次運行該應用程序

  • copydatabase()失敗,因爲該目錄 /data/data/com.news .mint/databases /當時不存在拋出與票中的異常不同的異常。

要使其工作,你應該做兩兩件事:

移動數據庫創建邏輯從DataBaseHelper-Constructor

@Override 
public SQLiteDatabase openOrCreateDatabase(final String name, 
     final int mode, final SQLiteDatabase.CursorFactory factory) { 

,你應該用

取代

String myPath = DB_PATH + DB_NAME; 
File dbfile = new File(myPath); 

... 
File dbfile = context.getDatabasePath(DB_NAME) 

// create directory if it does not exist. Else copydatabase will fail because directory does not exist yet. 
if (!dbfile.getParentFile().exists()) { 
    dbfile.getParentFile().mkdirs(); 
} 

測試此代碼,您應該手動刪除數據庫(或卸載應用程序)

/data/data/com.news.mint/databases/newsapp.db 

執行數據庫

相關問題