2012-03-06 2 views
0

Так им новое для работы с SQLite и андроида, я начал с создания класса DataBase Manager, как показано ниже:SQLite Android - как выбрать или проверить ряд

import android.content.ContentValues; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DataBaseManager extends SQLiteOpenHelper{ 

    static final String dbName ="LCInstore"; 

    static final String allIcons = "Icons"; 
    static final String homeIcons = "HomeScreenIcons"; 

    static final String colIconID = "IconID"; 
    static final String colID = "ID"; 
    static final String colImage = "IconImage"; 
    static final String colLabel = "IconLabel"; 
    static final String colName = "IconName"; 

    public DataBaseManager(Context context) { 
     super(context, dbName, null, 0); // starting value is zero must change on upgrades 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 

     // Create Icon Table if does not exist 
     db.execSQL("CREATE TABLE IF NOT CREATED"+ allIcons +"" + 
       "("+colIconID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+ 
        colName + " TEXT," + 
        colImage + " TEXT," + 
        colLabel + "TEXT)"); 

     // Create HomeScreen Icons Table if does not exist 
     db.execSQL("CREATE TABLE IF NOT EXIST" + homeIcons+"" + 
       "("+colID+" INTEGER NOT NULL, FOREIGN KEY ("+colID+") REFERENCES" + 
         ""+allIcons+" ("+colIconID+"));"); 

     InsertIcons(db); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXISTS "+allIcons); 

    } 

    private void InsertIcons(SQLiteDatabase db) { 
     ContentValues cv=new ContentValues(); 
      cv.put(colIconID, 1); 
      cv.put(colName, "Icon1"); 
      cv.put(colImage, "icon_one"); 
      cv.put(colLabel, "ONE"); 
      db.insert(allIcons, colIconID, cv); 

      cv.put(colIconID, 2); 
      cv.put(colName, "Icon2"); 
      cv.put(colImage, "icon_two"); 
      cv.put(colLabel, "TWO"); 
      db.insert(allIcons, colIconID, cv); 

      cv.put(colIconID, 3); 
      cv.put(colName, "Icon3"); 
      cv.put(colImage, "icon_three"); 
      cv.put(colLabel, "THREE"); 
      db.insert(allIcons, colIconID, cv); 

      db.close(); 
    } 

    public void AddHomeScreenIcon(int id){ 

    SQLiteDatabase db=this.getWritableDatabase(); 
    //HELP 
    // Need to check if id already exists in colID of homeIcons TABLE 
    // and if it doesn't do this 
    Cursor c = db.rawQuery("select * from "+ homeIcons +" where colID = " +id, null); 
    int numFound = c.getCount(); 

    if(numFound<1){ 
     ContentValues cv=new ContentValues(); 
     cv.put(colID, id); 
     db.insert(homeIcons, colID, cv); 
    } 

    // else do nothing 

} 

public void DeleteHomeScreenIcon (int id){ 
    SQLiteDatabase db=this.getWritableDatabase(); 
    db.delete(homeIcons, "id = " +id, null); 
    // HELP 
    //Need to find row of homeIcons table that matches id and delete it 
    db.close(); 
} 


} 

вы заметите в мои последние два метода, которые я поставил // HELP, эти комментарии - это то, что мне нужно для помощи.

ВОПРОС: Если я обновляю свое приложение, я предполагаю, что он не избавится от БД или не внесет никаких изменений в это .. но как вызывается onUpgrade .. и как я могу контролировать это при обновлениях?

ответ

0

Что вы ищете, можете решить по SQL с INSERT OR IGNORE INTO и DELETE FROM.

Update: SQL, было бы что-то вроде INSERT OR IGNORE INTO homeIcons VALUES(colID, cv) и DELETE FROM homeIcons WHERE ID=?

+1

hmm Это похоже на простейший подход .. но я думаю, что до сих пор неясно, как его написать .. – erik

+0

Я обновил ответ на примере SQL, который должен работать в SQLite –

+0

Я не вижу вашего обновления? существует ли разница между использованием INSERT ИЛИ IGNORE INTO homeIcons VALUES (colID, cv) и DELETE FROM homeIcons WHERE ID =? ' и как я это делаю сейчас? см. обновленный код? – erik

0

EDIT: 3/29/2014 фиксированной опечатка (= должна быть + в первом Snippit)

Чтобы определить, если они существуют вам нужно курсор с контекстом своей деятельности, а затем:

//Querying TABLE_NAME for ID in the colId column 
cursor = db.query(TABLE_NAME, 
        new String[] {ALL, My, COLUMN, NAMES, EG, colId }, 
        colId + " = ? ", 
        new String[]{String.valueOf(id)}, null, null, null); 

if (cursor.moveToFirst()) 
{ /* IT EXISTS! */ } 

Для удаления одинаково легко

db = this.getWriteableDatabase(); 
boolean success = db.delete(TABLE_NAME, 
      colID + " = ?", 
      new String[]{String.valueOf(id)})>0; 
0

Для запросов, если вы найдете db.query(), чтобы быть слишком утомительным и сложным, вместо этого вместо этого следует использовать db.rawQuery().

Для первого HELP вы можете попробовать:
Cursor cur = db.rawQuery("select * from homeIcons where colID = " + id, null);
затем использовать int numRows = cur.getCount();, чтобы получить количество столбцов, возвращаемых.

Для удалений:
int err = db.delete("homeIcons", "id = " + id, null);

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

+0

пару вопросов .. для удаления: почему не просто - db.delete (homeIcons, "id =" + id, null); Whats часть «int err =»? также в чем разница между whereClause и whereArgs? – erik

+0

Я отредактировал последние два метода .. они правильные? – erik

+0

Из текста они кажутся правильными. Но вам нужно запустить его, чтобы быть уверенным. Аргументы whereargs используются для замены каких-либо «?» вы можете иметь в whereclause. Ошибка дополняет последнюю строку: для операций, которые не являются запросами, всегда рекомендуется проверить возвращаемое значение для сбоев. –

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