2013-12-02 1 views
0

Я пытаюсь взять базу данных sqlite из папки с данными для создания новой базы данных в системе, поэтому, когда вы устанавливаете приложение на устройство, оно предварительно загружает некоторые данные - вставки - и таблица форма - create table -. я создал класс под названием «SQLDataBase», который простирается от SQLiteOpenHelper и имеет следующее тело:База данных активов SQLite JAVA ANDROID

public class SQLDataBase extends SQLiteOpenHelper { 
public static final String KEY_TITULO = "titulo"; 
private static final String KEY_COD="id"; 
private static final String KEY_GENERO="genero"; 
private static final String KEY_DIRECTOR="director"; 
private static final String KEY_DURACION="duracion"; 
private static final String TABLA_BASEDATOS = "peliculas"; 
private SQLiteDatabase myDataBase; 
private final Context myContext; 
private static final String DATABASE_NAME = "peliculass"; 
public final static String DATABASE_PATH ="/data/data/com.bdsqlite/databases/"; 
public static final int DATABASE_VERSION = 1; 

String sqlCreate ="create table peliculas (id integer primary key autoincrement, titulo text not null, director text not null,genero text not null, duracion int not null)"; 

public SQLDataBase(Context contexto) { 
    super(contexto, DATABASE_NAME, null, DATABASE_VERSION); 
    this.myContext = contexto; 
} 


public void createDatabase() throws IOException 
{ 

     boolean dbExist = checkDataBase(); 

     if(dbExist) 
     { 
      Log.v("DB Exists", "db exists"); 
     } 

     boolean dbExist1 = checkDataBase(); 
     if(!dbExist1) 
     { 
      this.getReadableDatabase(); 
      try 
      { 
        this.close();  
        copyDataBase(); 
      } 
      catch (IOException e) 
      { 
        throw new Error("Error copiando base de datos"); 
      } 
     } 

} 

//Comprobamos si la base de datos existe ya 
private boolean checkDataBase() 
{ 
     boolean checkDB = false; 
     try 
     { 
      String myPath = DATABASE_PATH + DATABASE_NAME; 
      File dbfile = new File(myPath); 
      checkDB = dbfile.exists(); 
     } 
     catch(SQLiteException e) 
     { 
     } 
     return checkDB; 
} 
//Copia la base de datos de la carpeta assets a la recien creada y vacia base de datos del sistema 
private void copyDataBase() throws IOException 
{ 
     String outFileName = DATABASE_PATH + DATABASE_NAME; 

     OutputStream myOutput = new FileOutputStream(outFileName); 
     InputStream myInput = myContext.getAssets().open(DATABASE_NAME); 

     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = myInput.read(buffer)) > 0) 
     { 
      myOutput.write(buffer, 0, length); 
     } 
     myInput.close(); 
     myOutput.flush(); 
     myOutput.close(); 
} 

//elimina la base de datos 
public void db_delete() 
{ 
     File file = new File(DATABASE_PATH + DATABASE_NAME); 
     if(file.exists()) 
     { 
      file.delete(); 
      System.out.println("Base de datos eliminada."); 
     } 
} 

//Abrir base de datos 
public void openDatabase() throws SQLException 
{ 
     String myPath = DATABASE_PATH + DATABASE_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
} 

public synchronized void closeDataBase()throws SQLException 
{ 
     if(myDataBase != null) 
      myDataBase.close(); 
     super.close(); 
} 

public void onCreate(SQLiteDatabase db) 
{ 
} 

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
{  
     if (newVersion > oldVersion) 
     { 
      Log.v("Database Upgrade", "Database version higher than old."); 
      db_delete(); 
     } 
} 


public void insertarContacto(String titulo, String director, String genero, int duracion) { 
    ContentValues valoresIniciales = new ContentValues(); 
    valoresIniciales.put(KEY_TITULO, titulo); 
    valoresIniciales.put(KEY_DIRECTOR, director); 
    valoresIniciales.put(KEY_GENERO, genero); 
    valoresIniciales.put(KEY_DURACION, duracion); 

    //return db.insert(TABLA_BASEDATOS, null, valoresIniciales); 
    myDataBase.execSQL("INSERT INTO peliculas(titulo,director,genero,duracion) VALUES (titulo,director,genero,duracion)"); 
} 

public Cursor obtenerTodasLasPeliculas() { 
    return myDataBase.query(TABLA_BASEDATOS, new String[] { KEY_COD, KEY_TITULO,KEY_DIRECTOR,KEY_GENERO,KEY_DURACION}, null, null, null, null, null); 
} 
public Cursor obtenerInfo(String nombre) { 
    return myDataBase.query(TABLA_BASEDATOS,new String[] { KEY_DIRECTOR,KEY_GENERO,KEY_DURACION} , "titulo=?", new String[] { nombre }, null, null, null); 

} 

public void cerrar() { 
    myDataBase.close(); 
} 

public Cursor obtenerPeliculasGenero(String genre) { 

    return myDataBase.query(TABLA_BASEDATOS, new String[] { KEY_COD, KEY_TITULO,KEY_DIRECTOR,KEY_DURACION}, "genero=?", new String[]{ genre }, null, null, null); 

} 

public void EliminarPelicula(String titulo){ 
    myDataBase.execSQL("DELETE FROM peliculas WHERE titulo='"+titulo+"'"); 

} 

public void ModificarPelicula(String titulo, String director, String genero, int duracion, String titulo2){ 
    myDataBase.execSQL("UPDATE peliculas SET titulo='"+titulo+"', director='"+director+"',genero='"+genero+"',duracion="+duracion+" WHERE titulo='"+titulo2+"'"); 

} 
} 

Теперь в моем главном классе:

SQLDataBase basededatos; 

в методе OnCreate:

basededatos=new SQLDataBase(this); 
mostrarpelicula(); 

public void mostrarPeliculas(){ 
    cont=0; 
    basededatos.getReadableDatabase(); 
    Cursor c=basededatos.obtenerTodasLasPeliculas(); 
    resultados=new String[c.getCount()]; 
    if (c.moveToFirst()) { 
      do { 

       DisplayFilm(c); 
      } while (c.moveToNext()); 
     } 

    basededatos.cerrar(); 
} 

public void DisplayFilm(Cursor c) { 

    resultados[cont]=c.getString(1); 
    cont++; 

} 

Оно не на самом деле работает, он говорит:

java.lang.NullPointerException at "return myDataBase.query(TABLA_BASEDATOS, 
new String[] { KEY_COD, KEY_TITULO,KEY_DIRECTOR,KEY_GENERO,KEY_DURACION}, null, null, null, null, null);" 

Можете ли вы мне помочь?

+2

Я * настоятельно рекомендую использовать 'SQLiteAssetHelper', а не перематывать этот код самостоятельно: https://github.com/jgilfelt/android-sqlite-asset-helper – CommonsWare

ответ

0

У меня была аналогичная настройка в одном из моих приложений, и проблема заключалась в имени моей базы данных.

Попробуйте изменить

private static final String DATABASE_NAME = "peliculass";

в

private static final String DATABASE_NAME = "peliculass.sqllite"; //or .sqllite3 or whatever the extension is

0

Если у вас есть база данных .db на руке, тогда все гораздо проще. Его возможно до конвертировать базу данных .sqlite в базу данных .db. После установки, когда ваше приложение первые старты инициализацию объекта SuperDatabase

SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.COPY_TO_SYSTEM); 

Для последующих запусков приложения, используйте

SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.READ_FROM_DEVICE); 

Теперь только огонь вашей невозвращающихся querys

database.sqlInject("INSERT INTO food VALUES('Banana','Vitamin A');"); 

Если у вас есть некоторые возвращающие запросы типа. Тогда можно получить результат в CSV, JSON или в XML.

В CSV

ArrayList<String> rows=new ArrayList<String>(); 
rows=database.sqlEjectCSV("SELECT * FROM food;"); 
for (int i=0;i<rows.size();i++) 
{ 
//Each row iterated with attribute values seperated by comma 
} 

Или, как JSON

String json=database.sqlEjectJSON("SELECT * FROM food;"); 

Или, как XML

String xml=database.sqlEjectXML("SELECT * FROM food;"); 

Чтобы использовать SuperDatabase, Вам нужно добавить эту библиотеку к вашему Gradle. Вот полная документация: https://github.com/sangeethnandakumar/TestTube

 Смежные вопросы

  • Нет связанных вопросов^_^