SQLite Android - как выбрать или проверить строку - PullRequest
0 голосов
/ 07 марта 2012

Так что я новичок в работе с SQlite и android. Я начал с создания класса DataBase Manager, как показано ниже:

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();
}


}

вы заметите, что в моих последних двух методах, которые я поставил // ПОМОГИТЕ, эти комментарии - вот что мне нужно для помощи ..

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

Ответы [ 3 ]

0 голосов
/ 07 марта 2012

РЕДАКТИРОВАТЬ: 29.03.2014 исправлена ​​опечатка (= должно быть + в первом фрагменте)

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

//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 голосов
/ 07 марта 2012

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

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

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

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

0 голосов
/ 07 марта 2012

То, что вы ищете, может быть решено в SQL с помощью INSERT OR IGNORE INTO и DELETE FROM.

Обновление : SQL будет выглядеть примерно как INSERT OR IGNORE INTO homeIcons VALUES(colID, cv) и DELETE FROM homeIcons WHERE ID=?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...