繁体   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