2011-09-23 11 views
11

Android uygulamamda bir veritabanı yazıyorum, ancak tablolarım oluşturulmuyor. OnCreate yöntemimde break noktaları ekledim ve getWriteableDatabase'im ve getWritableDatabase çağrıldı, ancak onCreate değil. onCreate() getWritableDatabase() tarafından çağrılmadı

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); 
    } 
} 

Ve veritabanı yardımcı içinde

Ben getWriteableDatabse() diyoruz:

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() yönteminin olası kopyası aranmıyor. Neden?] (Http://stackoverflow.com/questions/6791852/android-sqliteopenhelper-oncreate-method-is-not-called-why) – Machavity

cevap

18

yaratılması sadece (yani bir veritabanı yardımcı bütün duygusu) bir kez olur.

Veritabanınızın oluşturulup oluşturulmadığını kontrol ettiniz mi? /data/data/your.package.name/databases/dbname adresinde bulunur.

android uygulama ayarlarında Başvurunuz verileri temizlemek ederse, onCreate tekrar çağrılmalıdır ...

+0

Sorun tam olarak budur. Geliştirme aşamasında daha önce çalıştım, ancak hatalı biçimlendirilmiş bir sql komutu oluşturdum. Eclipse'deki uygulama ayarlarını nasıl temizlerim? – Francesca

+0

Neden sadece kodunuz olduğu için hiçbir şey değişmediği için tutulmada neden yapmak istediğinizi anlamıyorum. Mevcut uygulama verilerini cihazdan kaldırmak istiyorsanız, “Android Ayarları> Uygulama> Uygulamaları Yönet> Uygulamanız> Verileri sil” seçeneğine gidin (adlar eşleşmiyorsa özür dilerim, menüm Almancadır) – Knickedi

+0

tüm uygulama verilerini kaldırmak istiyorum (örneğin, örneğin silmek istemediğiniz diğer veritabanları varsa) Ben Android Debug Monitor ile devam etmenizi öneririm ve sadece sorunlu SQLite veritabanı dosyasını silin. Bu pozisyondayken, bu benim için bir çekicilik gibi çalıştı. – Godsmith

0

SQLiteOpenHelper.onCreate()SQLiteOpenHelper.getWritableDatabase() (veya SQLiteOpenHelper.getReadableDatabase() sonra) veritabanı mevcut değil yalnızca uygulamanın sonra geri çağrılır kalıcı depolama (ör. SD kart). Başka bir deyişle, kod başarıyla bir veritabanı oluşturuyorsa, kalıcı depolamada saklanan onCreate() sadece bir kez çağrılır. Veritabanı kalıcı depolama alanında mevcutsa ancak şemasını değiştiriyorsanız,

'u kullanarak, veritabanını ad, ancak daha önce kullanılmayan bir sürüm numarası ile açtığınızda geri çağrılan SQLiteOpenHelper.onUpgrade() kullanın. Eski şema nesnelerini bıraktığınız ve daha sonra yeni şemanızı oluşturmak için SQLiteOpenHelper.onCreate()'u arayabildiğiniz. Ve veritabanı açıldığında kodu çalıştırmak istiyorsanız (kod SQLiteOpenHelper.get[Writable,Readable]Database() ile geri çağrılır), onOpen() uygulayın. Ardından, veritabanınızı (veya veritabanınıza göre başlatılmış kodunuzu), SQLiteOpenHelper.onCreate() ve SQLiteOpenHelper.onOpen()'un her birinden çağrılan bir yöntemi çağırın. Örneğin, SQLiteDatabase.execSQL() gibi veri yönetimi yöntemlerini çağırmak için SQLiteDatabase numaralı bir başvuruyu kullanmak isteyebilirsiniz. her birinde

SQLiteOpenHelper.onCreate(SQLiteDatabase db) 

ve

SQLiteOpenHelper.onOpen(SQLiteDatabase db) 

çağrı bir şey işlemesi gerektiğini kodunuzda işleyicileri geri çağırma diğer nesne yaşam döngüsü etkinlik yok

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

olarak

gibi Android çoklu işleminizi gerçekleştirir. Ancak en azından veritabanı işlem kodunuz SQLiteOpenHelper.onCreate() ve SQLiteOpenHelper.onOpen() işlemlerini gerçekleştirmelidir.

0

Aynı problem vardı. Ben 2 çözümler

  1. Yeniden emülatörü fon ve Benim emülatör çok yavaş yeniden başlatılıyor 'kullanıcı Verilerini Wipe' at ...
  2. Değişim veritabanınızın Sürüm Numarası ve tekrar 'OnCreate' denilen ve bana verdi veritabanımın bir korsan versiyonu.Ben (hayır büyük Deal)

Good Luck

10

Bu oldukça aptal uygulama sınırlaması var depolanmış şu bilgileri kaybetti. :-) Veritabanı adının bir .db uzantısına sahip olduğundan emin olun. Uzantısı yoksa onCreate() çağrılmaz.

+1

wowContext.getDatabasePath (DB_NAME) .toString() kullanmak daha iyi olurdu ... çok teşekkür ederim! Bu beni delirtiyordu! ... Gerçekten aptal! – Mahm00d

+1

Android Belgesinde bile yok. Sahip oldukları örnek buna sahip değil. http://developer.android.com/training/search/search.html – Neta

+0

WOOOOOOOOOOW THX SO MUCH! bu şey beni deli ediyordu! + 1 dostum rulz –

0

Aynı problemi yaşıyordum. SQL_Create dizimde iki sql komutu arasında boşluk bıraktığımı ve ihtiyacım olan sütunun doğru bir şekilde uygulanmadığını, ancak String'de hatayı bulup düzeltdiğimde, bu sorunu gidermediğini çünkü uygulamayı zaten veritabanını o tabloya sahip olarak kaydettirdi. Yani onCreate hiç çağrılmadı. Benim için en basit çözüm, sürüm numarasını güncellemekti. Bu yeni bir db ve tablo (doğru) oluşturdu ve uygulamayı düzeltti.

İlgili konular