2014-09-20 137 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支持。相反,您必须创建一个包含所需新列的临时表,然后将旧表中的数据复制到此临时表,然后删除旧表,最后将临时表重命名为旧表的名称 - 最好在交易中防止中途出错。

希望这会有所帮助!

相关问题