2016-05-07 2 views
0

Я работаю с предварительно заполненной базой данных. Используя SQLite Manager в Mozilla, прямо сейчас у меня есть фиктивная база данных и просто хочу проверить метод onUpgrade, поэтому я изменил строку в одном из столбцов, экспортировал ее как новую базу данных и, как вы увидите в моем коде, попытался открыть обновленную версию. Также важное замечание, я обновляю номер версии по одному вручную в кодеSQLite onUpgrade() фрустрация

private static final int DB_VERSION = 3; 

и в onUpgrade

if (newVersion == 3) { 
     Log.e("WORKED!!", "onUpgrade executed"); 

так в следующий раз я буду обновлять эти два числа 4. Не уверен, что если Я делаю это правильно или что не так, но я получаю сообщение журнала, просто не видя данных, обновленных в приложении.

import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteQueryBuilder; 
import android.util.Log; 

import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.sql.SQLException; 
import java.util.ArrayList; 
import java.util.List; 


public class DataBaseHelper extends SQLiteOpenHelper { 
    private static String DB_PATH; 
    private static final String DB_NAME = "DummyTestOne.sqlite"; 
    private static final int DB_VERSION = 3; 
    private static final String DB_NAME2 = "DummyTestFive.sqlite"; 
    private SQLiteDatabase mDataBase; 
    private final Context mContext; 

public static final String DBTABLENAME = "questiontable"; 
public static final String DBATABLENAME = "answertable"; 
public static final String COLUMN_ID = "_id"; 
public static final String COLUMN_NAME = "question"; 
public static final String COLUMN_CATEGORY = "category"; 
public static final String COLUMN_FID = "fid"; 

public static final String COLUMN_ANSWER = "answer"; 

public DataBaseHelper(Context context) { 
    super(context, DB_NAME, null, DB_VERSION); 
    this.mContext = context; 

    DB_PATH = context.getDatabasePath(DB_NAME).getPath(); 


} 

public void createDataBase() { 
    boolean dbExist = checkDataBase(); 

    if (dbExist) { 

    } else { 
     this.getReadableDatabase(); 
     try { 
      copyDataBase(); 
     } catch (IOException e) { 
      throw new Error("Error copying database"); 
     } 
    } 
} 

private boolean checkDataBase() { 
    SQLiteDatabase checkDB = null; 

    try { 
     checkDB = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READWRITE); 
    } catch (SQLiteException e) { 
     Log.e(this.getClass().toString(), "Error while checking db"); 
    } 

    if (checkDB != null) { 
     checkDB.close(); 
    } 

    return checkDB != null ? true : false; 
} 

private void copyDataBase() throws IOException { 
    InputStream externalDbStream = mContext.getAssets().open(DB_NAME); 
    OutputStream localDbStream = new FileOutputStream(DB_PATH); 

    byte[] buffer = new byte[1024]; 
    int bytesRead; 
    while ((bytesRead = externalDbStream.read(buffer)) > 0) { 
     localDbStream.write(buffer, 0, bytesRead); 
    } 


    localDbStream.flush(); 
    localDbStream.close(); 
    externalDbStream.close(); 
} 

public void openDataBase() throws SQLException { 


    mDataBase = this.getWritableDatabase(); 

} 

@Override 
public synchronized void close() { 
    if (mDataBase != null) { 
     mDataBase.close(); 
    } 
    super.close(); 
} 

public Cursor getCursorForAllQs() { 
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 
    queryBuilder.setTables(DBTABLENAME); 

    String[] asColumnsToReturn = new String[]{COLUMN_ID, COLUMN_NAME, COLUMN_CATEGORY, COLUMN_FID}; 

    Cursor mCursor = queryBuilder.query(mDataBase, asColumnsToReturn, null, 
      null, null, null, "_id"); 

    return mCursor; 
} 

public List<String> getAnswersForQ(int questionFid) { 
    List<String> answers = new ArrayList<>(); 
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 
    queryBuilder.setTables(DBATABLENAME); 
    String[] tableColumns = new String[]{DataBaseHelper.COLUMN_ANSWER}; 
    String where = "fid = ?"; 
    String[] selectionArgs = new String[]{String.valueOf(questionFid)}; 
    String orderBy = DataBaseHelper.COLUMN_ID; 


    Cursor c = queryBuilder.query(mDataBase, tableColumns, where, selectionArgs, null, null, orderBy); 
    if (c.moveToFirst()) { 
     do { 
      try{ 
       answers.add(c.getString(c.getColumnIndex(DataBaseHelper.COLUMN_ANSWER))); 
      } catch (Exception e) { 
       Log.e("FAILED", c.getString((c.getColumnIndex(DataBaseHelper.COLUMN_ANSWER)))); 
      } 

     } while (c.moveToNext()); 
    } 
    Log.d("getAnswersForQ", answers.toString()); 
    return answers; 

} 

public String getName(Cursor c) { 
    return (c.getString(1)); 
} 



@Override 
public void onCreate(SQLiteDatabase db) { 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (newVersion == 3) { 
     Log.e("WORKED!!", "onUpgrade executed"); 
    } 
    if (newVersion > oldVersion) { 
     InputStream inputStream = null; 
     OutputStream outputStream = null; 
     String dbFilePath = DB_PATH + DB_NAME; 


     try { 
      inputStream = mContext.getAssets().open(DB_NAME2); 

      outputStream = new FileOutputStream(dbFilePath); 

      byte[] buffer = new byte[1024]; 
      int length; 
      while ((length = inputStream.read(buffer)) > 0) { 
       outputStream.write(buffer, 0, length); 
      } 

      outputStream.flush(); 
      outputStream.close(); 
      inputStream.close(); 
     } catch (IOException e) { 
      throw new Error("Problem copying database from resource file."); 
     } 
    } 
} 
} 
+0

Почему вы не вызываете copyDataBase внутри onUpgrade? –

+0

Вы предлагаете мне сделать это в блоке try onUpgrade()? Кроме того, у меня есть mContext.getAssets(). Open (DB_NAME) в copyDataBase(), который является первой версией БД, мне нужно будет изменить это каждый раз, когда я делаю обновление в БД, как в этом случае (DB_NAME2)? –

+0

В чем вопрос? –

ответ

2

Обновление базы данных означает изменение его на месте, сохраняя старые данные нетронутыми как можно больше. Итак, если вы хотите добавить или переименовать столбец, вы должны выполнить правильную команду SQL, чтобы сделать это в обратном вызове onUpgrade.

(Примечание: SQLiteAssetHelper делает с помощью заполняемых базы данных проще, и вы должны использовать его, но модернизация по-прежнему нуждается в отдельном SQL скрипт.)

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

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