簡體   English   中英

如何在我的Android應用程序中創建數據庫?

[英]how do i create the database in my android app?

我正在嘗試在Android應用中使用SQLite。 我已經創建了這樣的幫助器類:

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方法上創建它?

我該怎么做呢?

好吧,讓我們引用Docs

一個幫助程序類,用於管理數據庫創建和版本管理。

您創建一個實現onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)以及可選的onOpen(SQLiteDatabase)的子類,此類會負責打開數據庫(如果存在),創建數據庫(如果不存在)以及根據需要進行升級 事務用於確保數據庫始終處於明智狀態。

因此,這意味着您不必顯式創建SQLiteOpenHelper為您完成的“數據庫文件” 因此,第一次打開數據庫時,它將被創建。 (它將自動通過您的DataBaseHelper中的onCreate運行)

通常,您可以在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文件夾中的.sql腳本,例如upgrade_v1_v2.sql之類的名稱)來處理此問題。 。

您應該了解SQLite的一些陷阱,在這里進行了詳細說明:

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

但是,通常有解決方法。 例如,如果要向現有表中添加具有外鍵約束的新列,則不能為此使用ALTER TABLE命令,因為SQLite當前不支持該命令。 取而代之的是,您必須使用所需的新列集創建一個臨時表,然后將數據從舊表復制到此臨時表,然后刪除舊表,最后將臨時表重命名為舊表的名稱。 -所有這些交易都最好在交易中進行,以防中途出錯。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM