2016-03-08 3 views
0

Прошло несколько недель, и я не могу решить проблему. Вот он: Когда пользователь нажимает на изображение, я хочу обновить базу данных, чтобы добавить игру в «Избранное». Но я не знаю, почему, этого не будет. (Я использую базу данных, созданную с помощью браузера БД). Вот мой код:Обновление базы данных в приложении для Android

Обновление кода

favorite.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      pref = "co"; 
      favorite.setVisibility(View.GONE); 
      co.setVisibility(View.VISIBLE); 
      mDBHelper = new DataHelper(getApplication()); 
      mDBHelper.openDataBase(); 
      SQLiteDatabase mDB = mDBHelper.getWritableDatabase(); 

      //mDB.open(); 
      mDB.beginTransaction(); 

      ContentValues values = new ContentValues(); 
      values.put("pref", pref); 

      //String selection = "_id" +" = '" + ID + "'"; 
      String[]selectionArgs = new String[1]; 
      selectionArgs[0] = "" + ID; 

      mDB.update("tgames", 
        values, 
        "_id= ?", 
        selectionArgs); 

      mDB.setTransactionSuccessful(); 
      mDB.endTransaction(); 
      mDB.close(); 

данных кода Helper

public class DataHelper extends SQLiteOpenHelper { 

public static final String TABLE_ROW_ID = "_id"; 
public static final String TABLE_ROW_NAME = "name"; 
public static final String TABLE_ROW_PLACE = "place"; 
public static final String TABLE_ROW_AGEMIN = "agemin"; 
public static final String TABLE_ROW_AGEMAX = "agemax"; 
public static final String TABLE_ROW_NBREMIN = "nbremin"; 
public static final String TABLE_ROW_NBREMAX = "nbremax"; 
public static final String TABLE_ROW_TYPE = "type"; 
public static final String TABLE_ROW_DESCRIPTION = "description"; 
public static final String TABLE_ROW_PREF = "pref"; 
public static final String TABLE_ROW_IMG = "img"; 

private static final String TABLE_GAMES = "tgames"; 

private static final int DB_VERSION = 1; 

private static String TAG = "DataHelper"; 
private static String DB_PATH = ""; 
private static String DB_NAME = "games.db"; 
public static SQLiteDatabase mDB; 
private final Context mContext; 

File dbFile =new File(DB_PATH + DB_NAME); 

public DataHelper(Context context){ 
    super(context, DB_NAME, null, DB_VERSION); 
    if (Build.VERSION.SDK_INT >= 17){ 
     DB_PATH = context.getApplicationInfo().dataDir + "/databases/"; 
     //DB_PATH = context.getFilesDir().toString(); 
    }else{ 
     DB_PATH="/data/data/" + context.getPackageName() + "/databases/"; 
    } 
    this.mContext = context; 
} 

public void createDataBase() throws IOException 
{ 
    boolean mDataBaseExist = checkDataBase(); 
    if(!mDataBaseExist){ 
     this.getReadableDatabase(); 
    } 
    this.close(); 
    try{ 
     copyDataBase(); 
     Log.e(TAG, "createDatabase data base created"); 
    }catch (IOException mIOException){ 
     //throw new Error("ErroCopyingDatabase"); 
    } 
} 

private boolean checkDataBase(){ 
    File dbFile =new File(DB_PATH + DB_NAME); 
    return dbFile.exists(); 
} 

private void copyDataBase() throws IOException{ 
    InputStream mInput = mContext.getAssets().open(DB_NAME); 
    String outFileName = DB_PATH + DB_NAME; 
    OutputStream mOutPut = new FileOutputStream(outFileName); 
    byte[] mBuffer = new byte [1024]; 
    int mLength; 
    while ((mLength = mInput.read(mBuffer))>0){ 
     mOutPut.write(mBuffer, 0, mLength); 
    } 
    mOutPut.flush(); 
    mOutPut.close(); 
    mInput.close(); 
} 

public boolean openDataBase() throws SQLiteException { 
    String mPath = DB_PATH + DB_NAME; 
    mDB = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY); 
    //mDB = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); 
    return mDB != null; 
} 

public static Cursor selectAll(){ 
    Cursor cAll = mDB.rawQuery("SELECT * from tgames", null); 
    return cAll; 
} 

public static Cursor searchSIMPLE (String name, String place, int agemin, int agemax, int nbre, String type, String favorite){ 
    //A redefinir selon le critère 
    //peut etre une recherche par colonne, si élément est pas null? (mais les critères s'entrecroiseront pas alors) 

    String query = "SELECT * from " + 
      TABLE_GAMES + " WHERE " + 
      TABLE_ROW_AGEMIN + " <= '" + agemin + "' AND " + 
      TABLE_ROW_AGEMAX + " >= '" + agemax + "' AND " + 
      TABLE_ROW_NBREMIN + " <= '" + nbre + "' AND " + 
      TABLE_ROW_NBREMAX + " >= '" + nbre + "' AND " + 
      TABLE_ROW_PLACE + " = '" + place + "';"; 


    Cursor c = mDB.rawQuery(query, null); 
    return c; 
} 

public static Cursor searchADV (String name, String place, int agemin, int agemax, int nbre, String type, String favorite){ 

    String query = "SELECT * from " + 
      TABLE_GAMES + " WHERE " + 
      TABLE_ROW_AGEMIN + " <= '" + agemin + "' AND " + 
      TABLE_ROW_AGEMAX + " >= '" + agemax + "' AND " + 
      TABLE_ROW_NBREMIN + " <= '" + nbre + "' AND " + 
      TABLE_ROW_NBREMAX + " >= '" + nbre + "' AND " + 
      TABLE_ROW_PLACE + " = '" + place + "' AND " + 
      /*TABLE_ROW_PREF + " = '" + favorite + "'AND " +*/ 
      TABLE_ROW_TYPE + " = '" + type + "' ;"; 

    Cursor c = mDB.rawQuery(query, null); 
    return c; 
} 

public static Cursor searchADVName (String name, String place, int agemin, int agemax, int nbre, String type, String favorite){ 

    String query = "SELECT * from " + 
      TABLE_GAMES + " WHERE " + 
      TABLE_ROW_AGEMIN + " <= '" + agemin + "' AND " + 
      TABLE_ROW_AGEMAX + " >= '" + agemax + "' AND " + 
      TABLE_ROW_NBREMIN + " <= '" + nbre + "' AND " + 
      TABLE_ROW_NBREMAX + " >= '" + nbre + "' AND " + 
      TABLE_ROW_PLACE + " = '" + place + "' AND " + 
      TABLE_ROW_TYPE + " = '" + type + "' AND " + 
      /*TABLE_ROW_PREF + " = '" + favorite + "'AND " +*/ 
      TABLE_ROW_NAME + " LIKE '%" + name + "%' ; "; 

    Cursor c = mDB.rawQuery(query, null); 
    return c; 
} 

public static Cursor randomMachine(){ 
    int cnt = getCount(selectAll()); 
    Random r = new Random(); 
    int r1 = r.nextInt(cnt)+1; 
    String r2 = String.valueOf(r1); 

    String sql ="SELECT * FROM tgames WHERE _id = '" + r2 + "';" ; 

    Log.i("TEST", sql); 

    Cursor mCur = mDB.rawQuery(sql, null); 

    return mCur; 
} 

public static Cursor getType(String type) 
{ 
    String sql ="SELECT * FROM tgames WHERE type = '" +type + "';"; 
    Cursor mCur = mDB.rawQuery(sql, null); 
    return mCur; 

} 


private static int getCount(Cursor c){ 
    int cnt = c.getCount(); 
    return cnt; 
} 

@Override 
public void onCreate(SQLiteDatabase mDB) { 
} 

@Override 
public void onUpgrade(SQLiteDatabase mDB, int oldVersion, int newVersion) { 
    Log.v("TEST", "Upgrade 1"); 
    mDB.execSQL("DROP TABLE IF EXISTS " + "tgames"); 
    try { 
     createDataBase(); 
    }catch (Exception e){ 
     Log.v("TEST", "Upgrade FAILED"); 
    } 
} 


} 

Спасибо за вашу помощь.

EDIT: Я забыл, я выполняю эту операцию в дочерней деятельности основного вида деятельности. Когда я закрываю его и снова открываю, начальное состояние (любимое или нет) не изменилось. ,

+0

Вы получаете какие-либо ошибки? – Rohit5k2

+0

Thats weird part, у меня нет никакой ошибки, все идет гладко. – Enima

+0

Показать определение таблицы. –

ответ

0

Спасибо за всех людей, которые пытались помочь! Я думаю, что нашел ответ: Это была ошибка в методе создания базы данных, которая была воссоздана каждый раз, когда я открывал новое действие. Так я изменяю из этого:

public void createDataBase() throws IOException 
{ 
boolean mDataBaseExist = checkDataBase(); 
if(!mDataBaseExist){ 
    this.getReadableDatabase(); 
} 
this.close(); 
try{ 
    copyDataBase(); 
    Log.e(TAG, "createDatabase data base created"); 
}catch (IOException mIOException){ 
    //throw new Error("ErroCopyingDatabase"); 
} 
} 

к этому:

public void createDataBase() throws IOException 
{ 
    boolean mDataBaseExist = checkDataBase(); 
    if(!mDataBaseExist) { 
     this.getWritableDatabase(); 
     this.close(); 
     try { 
      copyDataBase(); 
      Log.e(TAG, "createDatabase data base created"); 
     } catch (IOException mIOException) { 
      //throw new Error("ErroCopyingDatabase"); 
     } 
    } 
} 

Спасибо всем, сохранить хорошую работу!

-1

Вы можете прочитать мой код для вставки новой записи в sqlite DB ниже: Примечание: я пишу только короткий код, чтобы узнать, как вставить новые данные в БД с некоторым полем и значениями.

public class DataHelper extends SQLiteOpenHelper { 

public void insertData(String name, String img){ 

     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put(TABLE_ROW_NAME, name); 
     contentValues.put(TABLE_ROW_IMG, img); 
     //add more value here ...... 
     db.insert("tgames", null, contentValues); 
} 

} 

так что вы можете вызвать функцию insertData всякий раз, когда вы хотите добавить в farvorite

+0

Я не был тем, чего ожидал, но дал мне хорошую идею, надеясь, что это решит мою проблему :) Я скоро вернусь. – Enima

+0

Я не знаю, почему некоторые люди проголосовали за мой ответ, потому что это короткий демо-код, чтобы помочь владельцу ответить очистить свой код. – GiapLee

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