我试图在我的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方法上创建它?
我该怎么做?
答案 0 :(得分:1)
好吧,让我们引用Docs:
用于管理数据库创建和版本管理的帮助程序类。
您创建了一个实现onCreate(SQLiteDatabase)的子类, onUpgrade(SQLiteDatabase,int,int)和可选项 onOpen(SQLiteDatabase),这个类负责打开 数据库(如果存在),如果不存在则创建它,并将其升级 必要。事务用于确保数据库始终 处于明智的状态。
所以这意味着,您不必明确地创建"数据库文件" 它由{{{{ 1}}。因此,当您第一次打开数据库时,它将被创建。 (它将在DataBaseHelper中自动运行SQLiteOpenHelper
答案 1 :(得分:1)
您通常在ContentProvider中使用SQLiteOpenHelper。
http://developer.android.com/guide/topics/providers/content-provider-basics.html
SQLite数据库是一个文件,但通常你不需要关心它。
确实在调用帮助程序的onCreate方法时创建了数据库文件(假设没有抛出异常。)请记住,除非卸载应用程序,否则不应期望再次调用此方法。
在应用程序的正常生命周期内,您可能会在应用程序商店中提供更新并发布新版本,人们将首次下载并安装它(onCreate调用)或更新它(onUpgrade称为ONLY)如果您增加了数据库版本号。)
由于Google Play商店目前不提供允许用户返回旧版应用的方法,因此您通常不必担心onDowngrade。但是,如果您在Google Play商店之外提供应用程序的旧版本,则至少应该覆盖onDowngrade,以便它不会抛出SQLiteException,这是默认实现的功能。
现在,回到onUpgrade。你可能需要做的一些事情是添加表,修改现有表,删除表等等。我已经通过编写.sql脚本来处理这个问题,我将这些脚本放在我的应用程序的assets文件夹中,名称类似于upgrade_v1_v2.sql 。
您应该了解SQLite的一些问题,详细说明如下:
http://www.sqlite.org/omitted.html
然而,通常有解决方法。例如,如果要将具有外键约束的新列添加到现有表,则不能使用ALTER TABLE命令,因为SQLite当前不支持该命令。相反,您必须使用所需的新列创建临时表,然后将旧表中的数据复制到此临时表,然后删除旧表,最后将临时表重命名为旧表的名称 - 最好在交易中保护中途出现问题。
希望这有帮助!