2011-09-23 114 views
11

我正在寫我的android應用程序的數據庫,但我的表沒有被創建。我在我的onCreate方法中添加了斷點,我的getWriteableDatabase和getWritableDatabase被調用,但onCreate不是。onCreate()不被getWritableDatabase()調用

package com.fslade.app; 

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

public class DatabaseHelper extends SQLiteOpenHelper { 
    private static final String DATABASE_NAME = "applicationdata"; 
    private static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_TABLE = "peopleT"; 

    // Database creation sql statement 
    private static final String DATABASE_CREATE = "create table " + DATABASE_TABLE + " (_id integer primary key autoincrement, " 
      + "company_name text not null, name text not null, city text not null, vertical text not null, title text not null, email text not null, bio text not null, photo text not null, status text not null);"; 

    public DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Method is called during creation of the database 
    @Override 
    public void onCreate(SQLiteDatabase database) { 
     database.execSQL(DATABASE_CREATE); 
    } 

    // Method is called during an upgrade of the database, e.g. if you increase 
    // the database version 
    @Override 
    public void onUpgrade(SQLiteDatabase database, int oldVersion, 
      int newVersion) { 
     Log.w(DatabaseHelper.class.getName(), 
       "Upgrading database from version " + oldVersion + " to " 
         + newVersion + ", which will destroy all old data"); 
     database.execSQL("DROP TABLE IF EXISTS todo"); 
     onCreate(database); 
    } 
} 

而在我的數據庫幫助我打電話getWriteableDatabse():

package com.fslade.app; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 

public class ContentStorageHelper { 
    public static final String KEY_ID = "_id"; 
    public static final String KEY_COMPANY_NAME = "company_name"; 
    public static final String KEY_PERSON_NAME = "name"; 
    public static final String KEY_CITY = "city"; 
    public static final String KEY_VERTICAL = "vertical"; 
    public static final String KEY_TITLE = "title"; 
    public static final String KEY_EMAIL = "email"; 
    public static final String KEY_BIO = "bio"; 
    public static final String KEY_PHOTO = "photo"; 
    public static final String KEY_STATUS = "status"; 

    private static final String[] COLUMNS = { KEY_ID, KEY_COMPANY_NAME, 
      KEY_PERSON_NAME, KEY_CITY, KEY_VERTICAL, KEY_TITLE, KEY_EMAIL, 
      KEY_BIO, KEY_PHOTO, KEY_STATUS }; 

    private Context context; 
    private SQLiteDatabase database; 
    private DatabaseHelper dbHelper; 

    public ContentStorageHelper(Context context) { 
     this.context = context; 
    } 

    public ContentStorageHelper open() throws SQLException { 
     dbHelper = new DatabaseHelper(context); 
     database = dbHelper.getWritableDatabase(); 
     // dbHelper.onCreate(database); 
// I added this onCreate() to see if it helped, but when I ran it 
// it said that the database had already been created 
     return this; 
    } 

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

/** 
* Create a new person If the person is successfully created return the new 
* rowId for that person, otherwise return a -1 to indicate failure. 
*/ 
public long createPerson(String company_name, String name, String city, 
     String vertical, String title, String email, String bio, 
     String photo, String status) { 
    ContentValues initialValues = createContentValues(company_name, name, 
      city, vertical, title, email, bio, photo, status); 

    return database.insert(DatabaseHelper.DATABASE_TABLE, null, 
      initialValues); 
} 

/** 
* Return a Cursor over the list of all people in the database 
* 
* @return Cursor over all notes 
*/ 
public Cursor fetchPeopleByVertical(String vertical) { 
    String selection = KEY_VERTICAL+"="+vertical; 
     Cursor result = database.query(DatabaseHelper.DATABASE_TABLE, COLUMNS, 
       selection, null, null, null, null); 
     return result; 
    } 

    private ContentValues createContentValues(String company_name, String name, 
      String city, String vertical, String title, String email, 
      String bio, String photo, String status) { 
     ContentValues values = new ContentValues(); 
     values.put(KEY_COMPANY_NAME, company_name); 
     values.put(KEY_PERSON_NAME, name); 
     values.put(KEY_CITY, city); 
     values.put(KEY_VERTICAL, vertical); 
     values.put(KEY_TITLE, title); 
     values.put(KEY_EMAIL, email); 
     values.put(KEY_BIO, bio); 
     values.put(KEY_PHOTO, photo); 
     values.put(KEY_STATUS, status); 
     System.out.print("test: " + status); 
     return values; 
    } 
} 
+1

未調用[Android SQLiteOpenHelper:onCreate()方法的可能重複。爲什麼?](http://stackoverflow.com/questions/6791852/android-sqliteopenhelper-oncreate-method-is-not-called-why) – Machavity

回答

18

創建僅發生一次(這是一個數據庫助手的整個意義上的)。

您是否檢查數據庫是否已創建?它位於/data/data/your.package.name/databases/dbname

如果您在Android應用程序設置清除應用程序數據,您應該onCreate再次調用...

+0

這正是問題所在。在開發早期,我已經運行了Create,但是使用格式錯誤的sql create命令。如何清除Eclipse中的應用程序設置? – Francesca

+0

我不明白你爲什麼想在eclipse中做什麼,因爲沒有什麼改變,因爲它只是你的代碼。如果你想從設備中刪除現有的應用程序數據,請進入'Android設置>應用程序>管理應用程序>你的應用程序>刪除數據'(對不起,如果名稱不匹配,我的菜單是德語) – Knickedi

+0

如果你不想要刪除所有的應用程序數據(如果有其他數據庫工作正常,你不想刪除例如)我建議通過Android調試監視器,並刪除只有有問題的SQLite數據庫文件。當我處於這個位置時,這對我來說就像是一種魅力。 – Godsmith

0

SQLiteOpenHelper.onCreate()之後SQLiteOpenHelper.getWritableDatabase()(或SQLiteOpenHelper.getReadableDatabase()之後),只有當數據庫中不存在中的應用程序的回調持久存儲(即SD卡)。換句話說,如果代碼成功地創建了一個存儲在持久性存儲中的數據庫,則僅調用onCreate()一次。如果數據庫存在於永久性存儲中,但您正在更改其架構,則可以使用SQLiteOpenHelper.onUpgrade(),當您按名稱打開數據庫時,會使用SQLiteOpenHelper.onUpgrade(),但使用之前未使用過的版本號來調用該數據庫。在其中刪除舊的模式對象,然後在其中調用SQLiteOpenHelper.onCreate()來創建新的模式。如果您想在打開數據庫時運行代碼(代碼由SQLiteOpenHelper.get[Writable,Readable]Database()調用),請執行onOpen()。然後調用一個方法來初始化您的數據庫(或根據您的數據庫初始化的代碼),該方法從SQLiteOpenHelper.onCreate()SQLiteOpenHelper.onOpen()中分別調用。

例如,您可能希望使用對SQLiteDatabase的引用,對其調用SQLiteDatabase.execSQL()等數據管理方法。

在每個

SQLiteOpenHelper.onCreate(SQLiteDatabase db) 

SQLiteOpenHelper.onOpen(SQLiteDatabase db) 

呼叫類似

void initDB(SQLiteDatabase db) 
{ 
    this.db = db; 
} 

有一些回調在代碼中的處理程序,你應該處理其他對象生命週期事件, Android多任務您的過程。但至少您的數據庫處理代碼必須處理SQLiteOpenHelper.onCreate()SQLiteOpenHelper.onOpen()

0

我有同樣的問題。我資助2個解決方案

  1. 重新啓動模擬器,並檢查「擦拭用戶數據」 我的模擬器是重新啓動緩慢,...
  2. 更改數據庫的版本號並再次將其稱爲「在OnCreate」,給了我我的數據庫的curret版本。我失去了存儲的信息(沒什麼大不了)

好運

10

這是一個相當愚蠢實施限制。 :-)確保數據庫名稱的擴展名爲.db。如果沒有擴展名,則不會調用onCreate()

+1

哇...非常感謝你!這讓我瘋狂!......真的很愚蠢! – Mahm00d

+1

甚至沒有在Android文檔中。他們的例子沒有。 http://developer.android.com/training/search/search.html – Neta

+0

WOOOOOOOOOOOW THX這麼多! 這件事讓我瘋狂! +1夥計你rulz –

0

我遇到了同樣的問題。我忘記了SQL_Create字符串中兩個sql命令之間的空格,所以我需要的列沒有正確實現,但是當我找到並修復了String中的錯誤時,它沒有解決問題,因爲App已經將該數據庫註冊爲具有該表格。所以onCreate從未被調用過。對我而言,最簡單的解決方案是更新版本號。這創建了一個新的數據庫和表(正確),並修復了應用程序。

相關問題