2012-06-04 109 views
7

我使用的標準方法,我從流行的記事本示例中學到了建立我的第一個的應用程序。
但我陷入了一個奇怪的問題。
SQLite數據庫文件(.db)未在/ data/data/package/databases中創建。我從HeadFirst android dev交叉檢查清單文件和OpenHelper文件。書(我正在使用它作爲參考),但我發現自己無法弄清楚爲什麼數據庫文件沒有創建..
是否有任何特殊的權限或我們需要切換到讓它工作?
奇怪的是,它對於預先加載的例子工作正常。意思是爲記事本示例創建'.db'文件,但是當我嘗試時,它失敗。 :(
這裏有我的文件沒有創建sqlite數據庫

包 - database.test

1 AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?> 

<uses-sdk android:minSdkVersion="10" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:name=".Database_testActivity" 
     android:label="@string/app_name" > 
    </activity> 
</application> 

2.TestOpenHelper.java

package database.test; 

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class TestOpenHelper extends SQLiteOpenHelper { 

TestOpenHelper(Context context){ 
    super(context,"mydb.db",null,1); 
} 
@Override 
public void onCreate(SQLiteDatabase database){ 
    database.execSQL("create table test_1 " + " (field1 integer primary key, field2 integer);"); 
} 
public void onUpgrade (SQLiteDatabase database, int oldVersion, int newVersion){ 
    database.execSQL("drop table if exists test1"); 
    onCreate(database); 
} 
} 

3.Database_testActivity.java

package database.test; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.ListView; 

public class Database_testActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ListView listview = (ListView)findViewById(R.id.test_list); 
    TestAdapter ta = new TestAdapter(); 
    listview.setAdapter(ta); 

    TestOpenHelper openHelper = new TestOpenHelper(this); 
} 
} 

我知道它的一個非常基本的問題,但我一直在努力解決這個去年15天現在我完全沮喪。
請幫助..

+1

你應該在不同的地方使用'Log'並監視'logcat'來跟蹤發生了什麼。此外,我可能是錯的,但你有沒有嘗試在「TestOpenHelper」構造函數中使用「mydb」作爲db名稱?正如我所說,我可能是錯的,但我不禁感覺使用文件擴展名(如「mydb.db」)可能會導致問題。 – Squonk

+0

你可以拋出一些'使用日誌'。我嘗試了各種名字,但沒有任何反應。 謝謝 – Bond

+0

也是每個應用程序。 in/data/data以com.android.something開頭,但我的不是。它可以成爲我的問題的原因? – Bond

回答

22

更改此:

database.execSQL("create table test_1 " + " (field1 integer primary key, field2 integer)"); 

TestOpenHelper openHelper = new TestOpenHelper(this);變化SQLiteDatabase db = new TestOpenHelper(this).getWritableDatabase();

你真的沒有創建的數據庫,你只能創建你SQLiteOpenHelper的實例,但用於創建或打開數據庫你必須使用getWritableDatabase()getReadableDatabase()方法。

從文檔

沒錯:

創建和/或打開將用於閱讀和寫作 數據庫。

+0

哇..那工作。非常感謝你。 – Bond

+3

+1 - 被抓住了。我沒有注意到'getWritableDatabase()'或'getReadableDatabase()'都沒有被調用。 – Squonk

+0

你的代碼沒有工作,因爲你從來沒有創建數據庫,你只創建SQLiteOpenHelper人的實例:-)爲創建數據庫,你必須調用'getWritableDatabase()'或'getReadableDatabase()'這個方法創建/打開你的數據庫。當你的數據庫已經被創建時,所以這個方法將永遠只能打開你的數據庫。 – Sajmon