如何在android应用程序中创建数据库?

如何在android应用程序中创建数据库?,android,sqlite,Android,Sqlite,我正在尝试在我的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,

我正在尝试在我的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方法上创建它吗

我该如何做到这一点呢?

好吧,让我们引用一下:

用于管理数据库创建和版本管理的帮助器类

创建一个子类,实现onCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase,int,int)和可选 onOpen(SQLiteDatabase),这个类负责打开 数据库(如果存在),创建数据库(如果不存在),并将其升级为 必要的。事务用于确保数据库始终处于可用状态 处于理智的状态


这意味着,您不必显式地创建由
SQLiteOpenHelper
为您完成的“数据库文件”。因此,当您第一次打开数据库时,它将被创建。(它将在DataBaseHelper中自动运行
onCreate

您通常使用ContentProvider中的SQLiteOpenHelper

SQLite数据库是一个文件,但通常您不需要关心它

数据库文件确实是在调用助手的onCreate方法时创建的(假设没有引发异常)。请记住,除非卸载应用程序,否则不应期望再次调用此方法

在应用程序的正常生命周期内,您可能会提供更新并将新版本发布到应用程序商店中,人们会在那里首次下载并安装它(调用onCreate)或更新它(仅当您增加数据库版本号时才调用onUpgrade)

由于Google play商店目前不提供允许用户返回应用程序旧版本的方法,因此您通常不必担心onDowngrade。但是,如果您在Google play商店之外提供应用程序的旧版本,则至少应该覆盖onDowngrade,这样它就不会抛出SQLiteException,而默认实现就是这样做的

现在,回到onUpgrade。您可能需要在此处执行的一些操作包括添加表、修改现有表、删除表等。我通过编写.sql脚本来处理这些操作,我将这些脚本放在应用程序的资产文件夹中,名称为upgrade_v1_v2.sql

SQLite中存在一些您应该注意的问题,这里有详细说明:

然而,通常会有变通办法。例如,如果要将带有外键约束的新列添加到现有表中,则不能对此使用ALTER table命令,因为SQLite当前不支持该命令。相反,您必须使用所需的一组新列创建一个临时表,然后将数据从旧表复制到此临时表,然后删除旧表,最后将临时表重命名为旧表的名称-最好在事务中这样做,以防止中途出错


希望这有帮助

不,你不需要创建数据库文件,我现在就知道了。还有一个问题:假设我有3个模型对象:人、事件和产品。这是否意味着每个模型对象将有3个helper类,从而产生3个数据库?您当然可以这样做,但更好的方法是只使用一个helper类和多个表示对象的数据库表。