2011-05-13 22 views
5
başlatılması zaman gerçekten benim Uygulaması'nda SQLLite kullanarak ile mücadele ediyorum

; Benim App Bazı xml ayrıştırma ve am başladığındaAndroid SQLite Nerede ve SQLiteOpenHelper

public void onCreate(SQLiteDatabase db) { 
db.execSQL("CREATE TABLE myTestTable (Id INTEGER PRIMARY KEY , " 
      + "info TEXT," + 
      + "TopLeft TEXT")); <-- example insert 

} 

: Ben yaklaşık 6 tablolar oluşturma am OnCreate yılında SQLiteOpenHelper

den
public class DatabaseHelper extends SQLiteOpenHelper { 

uzanan bir veritabanı yardımcı sınıf kurdunuz

Verileri masaya girdiğimde, veritabanını kontrol ettim ve hepsi orada ve tablolarım doğru oluşturuldu.

Ben o gitti verileri çağırmak için gitmek

! benim dbhelper sınıfı içinde ve her aktivite ben farklı sorgular bir sürü var; m yeniden yüzden sınıf içindeki benim fonksiyonuna alabilirsiniz sınıfını initilizing.

Bunu yapmak için bir yol açmıyorum çünkü bu benim yeniden oluşturduğumda ve tüm tabloları siliyor (ya da en azından DB'yi kontrol ettiğimde göründüğü zaman yaptığım gibi görünüyor. o ve ben OnCreate sadece bir kez koştu izlenime kapıldım

! boş, ama benim DB her şey yeniden ve benim verileri silerek gibi görünen bu besbelli durum böyle değil! Eğer içindir

dbhelper sınıfını başlatmak ve tabloları yeniden durdurmak nasıl? ben uygulama kapandıktan bile devam etmek veri gerek!

Kafam karıştı!

mantıklı değil bunu bu şekilde açıklamak nasıl belirli soru sormak lütfen!

GÜNCELLEME

ben

tabloları yeniden durdurur
CREATE TABLE IF NOT EXISTS 

ekleyebilir bulduk, ama yine de .. Sağ OnCreate her zaman aradığını görünmüyor

+0

İyi soru ve birinin kadarıyla senin olsa "insert" veritabanını kapatmadan önce başarılı bir işlem işaretleme gibi, bir cevap geliyor umut? –

+0

Sınıfınızı statik olarak bildirmek sorunu çözüyor mu? –

+0

@DAVE G Tüm veriler kesinlikle DB'ye giriyor, DB'yi ekledikten sonra kapatmam mı gerekiyor? Şu anda yapıyor: \t SQLiteDatabase db = this.getWritableDatabase(); .... tüm verileri harmanlayıp yapıyor: db.insert ("TABLENAME", null, cv); ... ve bunun sonu nedir ?! – Bex

cevap

2

Çevresine sarıcı bir sınıf koyabilirsiniz?

public class DbAdapter 
{ 

    // database details 
    private static final String DATABASE_NAME = "dbname"; 
    private static final int DATABASE_VERSION = 1; 

    // where we're running 
    private final Context mCtx; 

    private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
    DatabaseHelper(Context context) 
    { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     // your initial database create statements go here 
     db.execSQL(DATABASE_CREATE); 
    } 

    // if you need to recreate the database, you just up the version number 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    { 
     // drop commands for each table goes here 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
     onCreate(db); 
    } 
    } 

    public DbAdapter(Context ctx) 
    { 
    this.mCtx = ctx; 
    } 

    public DbAdapter open() throws SQLException 
    { 
    mDbHelper = new DatabaseHelper(mCtx); 
    mDb = mDbHelper.getWritableDatabase(); 
    return this; 
    } 

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

    // other database methods can go here 
} 
0

sana deyimi ile ne demek emin değilim -

"Ben her etkinlik; m yeniden yüzden de alabilirsiniz sınıf initilizing sınıftaki işlevim.

Veritabanına erişmeniz gereken her etkinlikte, yapmanız gereken tek şey veritabanını açmak, tablodaki verilere erişmek/güncelleştirmek ve işleyiciyi kapatmaktır.

bu basit örnek NotePad uygulamasını gördünüz mü -

NotePad sample app by Google

o

1

onCreate() yöntem size veritabanına erişmeye çalıştığınızda ve oluşturulduğu değil sadece ilk sefer denir yardımcı olacaktır olabilir. Yani onCreate() sadece bir kez çağrılacak. getWritableDatabase, bir db nesnesi döndürür ve gerekirse onCreate()'u arayacaktır. NotePadProvider, SQLiteOpenHelper'un nasıl kullanıldığına iyi bir örnek verir.

+0

Veritabanına ilk kez eriştiğinizde, hiç veya mevcut "oturum" sırasında mı demek istiyorsunuz? – Bex

+0

Demek istediğim .... –

+0

NotePad örnek uygulaması bağlantısı bozuldu. Nereye taşındığı hakkında bir fikrin var mı? – syonip

0

DB başlatma kodu, Helper's onCreate yönteminize gitmelidir. android SQLiteOpenHelper javadocs itibaren :

/** 
* Called when the database is created for the first time. This is where the 
* creation of tables and the initial population of the tables should happen. 
* 
* @param db The database. 
*/ 
public abstract void onCreate(SQLiteDatabase db);