2012-07-16 51 views
1

我目前正在爲Android的SDK,讓我打開/應用程序複製應用程序外已經取得的數據庫。我無法讓我的程序讀取數據庫中的表格。根據我之前發佈的question的一些建議,我編寫了一個類,可以直接調用SQLiteDatabase,也可以使用Android SDK附帶的sqlite3版本創建我的數據庫。現在,出於某種原因,我的程序甚至無法打開數據庫。似乎認識到它在那裏,但Logcat(我正在使用Eclipse Juno和ADT插件)現在一直告訴我它「無法打開數據庫」。任何人都知道問題可能是什麼?Android的 - 無法打開[SQL]數據庫錯誤

這裏是我的所有代碼(被徹底的緣故):

public class MyDatabase 
{ 
private static final String TABLE_OS = "OregonState"; 
private static final String COLUMN_ID = "_id"; 
private static final String COLUMN_NAME = "Name"; 
private static final String COLUMN_FIELD = "Field"; 

SQLiteDatabase database; 
String path; 

public MyDatabase() 
{ 
     File file = new File("/scratch/android-sdk-linux/tools/os.sqlite"); 
     database = SQLiteDatabase.openOrCreateDatabase(file, null); 
     path = database.getPath(); 
     database.close(); 
} 

public long insert(ContentValues values, String name, String field) 
{ 
    database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE); 
    values.put("Name", name); 
    values.put("Field", field); 
    long id = database.insert(TABLE_OS, null, values); 
    database.close(); 
    return id; 
} 

public long insert(ContentValues values, String name) 
{ 
    database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE); 
    values.put("Name", name); 
    long id = database.insert(TABLE_OS, null, values); 
    database.close(); 
    return id; 
} 

public int delete(int id) 
{ 
    database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE); 
    database.delete(TABLE_OS, COLUMN_ID + "=" + id, null); 
    database.close(); 
    return 1; 
} 

public int update(ContentValues values, int id, String name, String field) 
{ 
    database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE); 
    values.put("Name", name); 
    values.put("Field", field); 
    database.update(TABLE_OS, values, COLUMN_ID + "=" + id, null); 
    database.close(); 
    return 1; 
} 

public int update(ContentValues values, int id, String name) 
{ 
    database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE); 
    values.put("Name", name); 
    database.update(TABLE_OS, values, COLUMN_ID + "=" + id, null); 
    database.close(); 
    return 1; 
} 

public Cursor get(int id) 
{ 
    return database.query(TABLE_OS, new String[] {COLUMN_ID, COLUMN_NAME, COLUMN_FIELD}, COLUMN_ID + "=" + id, null, null, null, null); 
} 

public Cursor getAll() 
{ 
    return database.query(TABLE_OS, new String[] {COLUMN_ID, COLUMN_NAME, COLUMN_FIELD}, null, null, null, null, null); 
} 
} 


public class SQLTest extends Activity 
{ 
SQLAdapter adapter; 
MyDatabase database; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_sqltest); 
    database = new MyDatabase(); 
    database.getAll(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    getMenuInflater().inflate(R.menu.activity_sqltest, menu); 
    return true; 
} 

public long insert(String name, String field) 
{ 
    ContentValues values = new ContentValues(); 
    long id = database.insert(values, name, field); 
    return id; 
} 

public long insert(String name) 
{ 
    ContentValues values = new ContentValues(); 
    long id = database.insert(values, name); 
    return id; 
} 

public int delete(int id) 
{ 
    int rowsDeleted = database.delete(id); 
    return rowsDeleted; 
} 

public int update(int id, String name, String field) 
{ 
    ContentValues values = new ContentValues(); 
    int rowsUpdated = database.update(values, id, name, field); 
    return rowsUpdated; 
} 

public int update(int id, String name) 
{ 
    ContentValues values = new ContentValues(); 
    int rowsUpdated = database.update(values, id, name); 
    return rowsUpdated; 
} 

public void get(int id) 
{ 
    Cursor cursor = database.get(id); 
    TextView tv = new TextView(this); 
    String table = ""; 
    if (cursor.moveToFirst()) 
     table += "\n" + cursor.getString(0) + " " + cursor.getString(1) + " " + cursor.getString(2); 
    else 
     table += "No hall found with ID: " + id; 
    tv.setText(table); 
    setContentView(tv); 
    cursor.close(); 
} 

public void getAll() 
{ 
    TextView tv = new TextView(this); 
    String table = ""; 
    try 
    { 
     Cursor cursor = database.getAll(); 
     if (cursor.moveToFirst()) 
     { 
      do 
      { 
       table += "\n" + cursor.getString(0) + " " + cursor.getString(1) + " " + cursor.getString(2); 
      } while (cursor.moveToNext()); 
     } 
     cursor.close(); 
    } catch (Exception e) {} 
    tv.setText(table); 
    setContentView(tv); 
} 
} 

這裏也是我的logcat日誌:

07-16 15:27:08.364: E/Trace(810): error opening trace file: No such file or directory (2) 
07-16 15:27:08.504: E/SQLiteLog(810): (14) cannot open file at line 30174 of [00bb9c9ce4] 
07-16 15:27:08.504: E/SQLiteLog(810): (14) os_unix.c:30174: (2) open(/scratch/android-sdk-linux/tools/os.sqlite) - 
07-16 15:27:08.524: E/SQLiteDatabase(810): Failed to open database '/scratch/android-sdk-linux/tools/os.sqlite'. 
07-16 15:27:08.524: E/SQLiteDatabase(810): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:709) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:702) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at com.example.sql2.MyDatabase.<init>(MyDatabase.java:26) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at com.example.sql2.SQLTest.onCreate(SQLTest.java:20) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.app.Activity.performCreate(Activity.java:5008) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.os.Looper.loop(Looper.java:137) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at android.app.ActivityThread.main(ActivityThread.java:4745) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at java.lang.reflect.Method.invokeNative(Native Method) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at java.lang.reflect.Method.invoke(Method.java:511) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
07-16 15:27:08.524: E/SQLiteDatabase(810): at dalvik.system.NativeStart.main(Native Method) 
07-16 15:27:08.524: D/AndroidRuntime(810): Shutting down VM 
07-16 15:27:08.524: W/dalvikvm(810): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
07-16 15:27:08.534: E/AndroidRuntime(810): FATAL EXCEPTION: main 
07-16 15:27:08.534: E/AndroidRuntime(810): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sql2/com.example.sql2.SQLTest}: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.os.Looper.loop(Looper.java:137) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.app.ActivityThread.main(ActivityThread.java:4745) 
07-16 15:27:08.534: E/AndroidRuntime(810): at java.lang.reflect.Method.invokeNative(Native Method) 
07-16 15:27:08.534: E/AndroidRuntime(810): at java.lang.reflect.Method.invoke(Method.java:511) 
07-16 15:27:08.534: E/AndroidRuntime(810): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
07-16 15:27:08.534: E/AndroidRuntime(810): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
07-16 15:27:08.534: E/AndroidRuntime(810): at dalvik.system.NativeStart.main(Native Method) 
07-16 15:27:08.534: E/AndroidRuntime(810): Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:709) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:702) 
07-16 15:27:08.534: E/AndroidRuntime(810): at com.example.sql2.MyDatabase.<init>(MyDatabase.java:26) 
07-16 15:27:08.534: E/AndroidRuntime(810): at com.example.sql2.SQLTest.onCreate(SQLTest.java:20) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.app.Activity.performCreate(Activity.java:5008) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
07-16 15:27:08.534: E/AndroidRuntime(810): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
07-16 15:27:08.534: E/AndroidRuntime(810): ... 11 more 

回答

0

我回答給我的另一個問題的答案,並改寫了使用兩個單獨的類我的代碼,以及適配器和一個助手,這竟然完美地工作。我正在向代碼提供link以防其他人像我一樣在開發SQLiteDatabase時遇到問題。

0

據我記得,有沒有Android文件系統中的「scratch」目錄。當您致電

File file = new File("/scratch/android-sdk-linux/tools/os.sqlite"); 
database = SQLiteDatabase.openOrCreateDatabase(file, null); 

我相信第二個語句會拋出一些錯誤,因爲/scratch/android-sdk-linux/tools/os.sqlite文件路徑不存在。嘗試撥打file.mkdirs()file.createNewFile()

+0

在我的機器,/劃痕確實存在。 – NioShobu 2012-07-16 23:17:41

+0

另外,我不想創建一個新文件。我試圖打開並複製已經創建的數據庫。 – NioShobu 2012-07-16 23:22:02

+0

你在說你的開發機器還是你的Android設備? – tiguchi 2012-07-16 23:22:36

1

Logcat顯示該目錄不存在。這並不奇怪,因爲在Android設備上根目錄下通常不存在scratch目錄。

這也是最好避免使用絕對路徑名,以及你不能肯定,他們會一直在你的應用程序可能運行在不同的設備上存在。爲應用程序訪問文件的正確方法是在打開文件時使用Environment。例如:

File file = new File(Environment.getExternalStorageDirectory() + "/scratch/os.sqlite"); 

這將在SD卡或指定爲「SD卡」內部存儲器中的軟鏈接的目錄典型地存在。所以這個例子會在scratch目錄下的sdcard上打開一個文件。

如何獲得到設備或模擬器您的數據庫文件是由你。如果您使用的是仿真器,則可以使用文件資源管理器將文件推送到適當的目錄中。

+0

'Enviroment'應該是環境,但是「編輯必須至少有6個字符」。 – 2013-04-28 18:09:23

+0

@AaronJLang明白了,謝謝。 – 2013-04-28 20:48:55

2

此權限添加到您的項目

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
1

Android的默認壓縮與大小大於1MB的文件。 Android操作系統的舊版本有一個bug,導致壓縮資源文件被讀incorrectly.The最簡單的解決方法是使用資源的文件擴展名,例如」 .MP3"

+0

這些舊版本具體是什麼?例如,小於4.0? – 2016-03-05 21:22:29