2014-09-20 136 views
0

我想在我的Android應用程序中使用SQLite。我創建了這樣的幫助類:如何在我的android應用程序中創建數據庫?

public class EventoSQLHelper { 

    // Configuração da base(nome e versão) 
    private static final int DB_VERSAO = 1; 
    private static final String DB_NOME = "pacixDB"; 

    // Configuração da tabela (nome, colunas, tag para log) 
    private static final String tabela_nome = "eventos"; 
    private static final String coluna_id = "id"; 
    private static final String coluna_desc = "descricao"; 
    private static final String coluna_data = "dataEvento"; 
    private static final String TAG = EventoSQLHelper.class.getSimpleName(); 

    // Comando sql para criação da tabela 
    private static final String DATABASE_CREATE = "create table if not exists eventos (id integer primary key autoincrement, " 
      + "descricao VARCHAR not null, dataEvento date);"; 

    // Contexto para o qual vai passar as informações 
    private final Context context = null; 

    private DataBaseHelper DBHelper; 
    private SQLiteDatabase database; 

    // Helper que extende de SQLiteOpenHelper - implementa práticas para salvar, 
    // criar, etc 
    private static class DataBaseHelper extends SQLiteOpenHelper { 

     DataBaseHelper(Context context) { 
      super(context, DB_NOME, null, DB_VERSAO); 
     } 

     // executado quando cria a classe: cria a base se não existir 
     @Override 
     public void onCreate(SQLiteDatabase db) { 
      try { 
       db.execSQL(DATABASE_CREATE); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     // método para upgrade da base 
     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      Log.w(TAG, "Atualizando base da versão " + oldVersion 
        + " para a versão " + newVersion 
        + ", que irá destruir todos os dados."); 
      db.execSQL("DROP TABLE IF EXISTS eventos"); 
      onCreate(db); 
     } 
    } 

    public EventoSQLHelper Open() throws SQLException { 
     this.database = DBHelper.getWritableDatabase(); 
     return this; 
    } 

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

    public long inserirRegistro(String descricao, String data) { 
     ContentValues valoresIniciais = new ContentValues(); 
     valoresIniciais.put(coluna_desc, descricao); 
     valoresIniciais.put(coluna_data, data); 
     return database.insert(tabela_nome, null, valoresIniciais); 
    } 

    public boolean deletarRegistro(long id) { 
     return database.delete(tabela_nome, coluna_id + " = " + id, null) > 0; 
    } 

    public Cursor getRegistros() { 
     return database.query(false, tabela_nome, new String[] { coluna_id, 
       coluna_desc, coluna_data }, null, null, null, null, null, null); 
    } 

我在互聯網上跟着一些教程,我已經瞭解了sqlhelper類。但現在,我如何創建數據庫?這是一個文件,對吧?我必須在我的主要活動的onCreate方法上創建它嗎?

我該怎麼做?

+0

不,你不需要創建數據庫文件 – AndikaK 2014-09-20 15:47:15

回答

1

好吧,讓我們引用Docs

一個輔助類來管理數據庫的創建和版本管理。

創建實施的onCreate(SQLiteDatabase)的子類, onUpgrade(SQLiteDatabase,INT,INT)和可選 的OnOpen(SQLiteDatabase),這個類需要(如果存在)打開 數據庫的照顧,如果創建它沒有,並且升級它作爲 必要。事務用於確保數據庫始終處於明智狀態 。

那麼這是什麼意思是,你不必明確地創建「數據庫文件」它是由SQLiteOpenHelper爲你做。所以第一次打開你的數據庫時,它將被創建。 (它會自動在您的DataBaseHelper中通過onCreate運行)

+0

Ooooh我現在明白了。這裏有另一個問題:假設我有3個模型對象:人員,事件和產品。這是否意味着它將成爲每個模型對象的3個助手類,導致3個數據庫? – 2014-09-20 16:03:33

+0

你絕對可以做到這一點,但更好的方法是隻使用一個助手類和多個表示你的對象的數據庫表。 – reVerse 2014-09-21 08:16:32

1

您通常使用ContentProvider中的SQLiteOpenHelper。

http://developer.android.com/guide/topics/providers/content-provider-basics.html

SQLite數據庫是一個文件,但通常你不必關心這個。

確實在調用助手的onCreate方法時創建數據庫文件(假設沒有拋出異常)。請記住,除非您卸載該應用程序,否則不應再指望再次調用此方法。

在應用程序的正常生命週期中,您可能會提供更新並在應用商店中發佈新版本,供用戶首次下載並安裝(onCreate調用)或更新(onUpgrade調用只有當您增加數據庫版本號時)。

由於Google Play商店目前不提供允許用戶返回到舊版應用的方式,因此您通常不必擔心onDowngrade 。但是,如果您在Google Play商店外提供較早版本的應用,則至少應該覆蓋onDowngrade,以免它引發默認實現所執行的SQLiteException。

現在回到onUpgrade。你可能需要做的一些事情是添加一個表,修改一個現有的表,刪除一個表等。我已經通過編寫.sql腳本處理了這個問題,這些腳本放在我的應用的assets文件夾中,名稱爲upgrade_v1_v2.sql 。

有一些陷阱與SQLite的你應該知道的是在這裏詳細介紹:

http://www.sqlite.org/omitted.html

但是通常有變通方法。例如,如果您想將具有外鍵約束的新列添加到現有表中,則不能使用ALTER TABLE命令,因爲它目前不受SQLite支持。相反,您必須創建一個包含所需新列的臨時表,然後將舊錶中的數據複製到此臨時表,然後刪除舊錶,最後將臨時表重命名爲舊錶的名稱 - 最好在交易中防止中途出錯。

希望這會有所幫助!

相關問題