Работа с SQLite. Прослемы с обновлением и выборкой.
Добавлено: 05 июн 2013, 13:12
Добрый день.
Помогите, пожалуйста, разобраться в 2х проблемах:
1) Создал класс, который работает с 2мя таблицами:
При этом если указать новый DB_VERSION, обновляется только 1я таблица (смотрю по LogCat), у 2й вызывается лишь 1 конструктор.
2) Выборка из таблицы
прекрасно происходит если task - число, но если task = "test1" или др. текст, получаю сообщение
При полном переборе данных в таблице вижу, что данные test1 там есть, но ошибка возникает. Вместо "like" ставил "=", результат тот же. в БД поле точно текстовое (text). Есть какое-то правило на выбор текстовых полей?
Полный код классов:
Помогите, пожалуйста, разобраться в 2х проблемах:
1) Создал класс, который работает с 2мя таблицами:
Код: Выделить всё
private static final int DB_VERSION = 135;
private SQLiteOpenHelper dbDataHelper;
private SQLiteOpenHelper dbSpinnerHelper;
private SQLiteDatabase dbase;
public DBData(Context context) {
mCtx = context;
}
public void open() {
Log.d(TAG, "open");
dbDataHelper = new DBDataHelper(mCtx, DB_NAME, null, DB_VERSION);
dbSpinnerHelper = new DBSpinnerHelper(mCtx, DB_NAME, null, DB_VERSION);
dbase = dbDataHelper.getWritableDatabase();
}
****
2) Выборка из таблицы
Код: Выделить всё
public Cursor getDataByTask(String task) {
Log.d(TAG, "getDataByTask");
return dbase.query(DBDataHelper.DB_TABLE, DB_TEXT_COLUMNS1, DBDataHelper.COLUMN_TIME_TASK + " like " + task, null, null, null, null);
} Код: Выделить всё
sqlite returned: error code = 1, msg = no such column: test1Полный код классов:
Код: Выделить всё
package com.amizaar.businesstimer;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBData {
private static final String TAG = "DBData";
private static final String DB_NAME = "my_spinner_db";
private static final int DB_VERSION = 135;
private static final String[] DB_TEXT_COLUMNS1 = { DBDataHelper.COLUMN_TIME };
private static final String[] DB_TEXT_COLUMNS2 = { DBSpinnerHelper.COLUMN_TIME_TASK };
private final Context mCtx;
private SQLiteOpenHelper dbDataHelper;
private SQLiteOpenHelper dbSpinnerHelper;
private SQLiteDatabase dbase;
public DBData(Context context) {
mCtx = context;
}
public void open() {
Log.d(TAG, "open");
dbDataHelper = new DBDataHelper(mCtx, DB_NAME, null, DB_VERSION);
dbSpinnerHelper = new DBSpinnerHelper(mCtx, DB_NAME, null, DB_VERSION);
dbase = dbDataHelper.getWritableDatabase();
//не обновляется 2я таблица
// dbDataHelper.onUpgrade(dbase, DB_VERSION, DB_VERSION + 1);
// dbase.close();
//dbase = dbSpinnerHelper.getWritableDatabase();
// dbase = dbDataHelper.getWritableDatabase();
}
// закрыть подключение
public void close() {
if (dbDataHelper!=null)
dbDataHelper.close();
if (dbSpinnerHelper!=null)
dbSpinnerHelper.close();
}
// получить все данные из таблицы DB_TABLE
public Cursor getAllData() {
// SQLiteDatabase dbase = dbDataHelper.getReadableDatabase();
return dbase.query(DBDataHelper.DB_TABLE, null, null, null, null, null, null);
}
public Cursor getDataByTask(String task) {
Log.d(TAG, "getDataByTask");
// SQLiteDatabase dbase = dbDataHelper.getReadableDatabase();
// Cursor cursor = dbase.query(DBSpinnerHelper.DB_TABLE, DB_TEXT_COLUMNS2, DBSpinnerHelper.COLUMN_ID + "=" + id, null, null, null, null);
return dbase.query(DBDataHelper.DB_TABLE, DB_TEXT_COLUMNS1, DBDataHelper.COLUMN_TIME_TASK + " like " + task, null, null, null, null);
}
// добавить запись в DB_TABLE
public void addRec(String value1, String value2) {
ContentValues cv = new ContentValues();
cv.put(DBDataHelper.COLUMN_TIME_TASK, value1);
cv.put(DBDataHelper.COLUMN_TIME, value2);
dbase.insertWithOnConflict(DBDataHelper.DB_TABLE, null, cv, SQLiteDatabase.CONFLICT_IGNORE);
}
// удалить запись из DB_TABLE
public void delRec(long id) {
dbase.delete(DBDataHelper.DB_TABLE, DBDataHelper.COLUMN_ID + " = " + id, null);
}
public void delRecByTask(String task) {
dbase.delete(DBDataHelper.DB_TABLE, DBDataHelper.COLUMN_TIME_TASK + " = " + task, null);
}
/////////////////////DBSpinnerHelper methods/////////////////////////////
public Cursor getAllSpinnerData() {
return dbase.query(DBSpinnerHelper.DB_TABLE, null, null, null, null, null, null);
}
public String getSpinnerDataByTask(int id) {
Cursor cursor = dbase.query(DBSpinnerHelper.DB_TABLE, DB_TEXT_COLUMNS2, DBSpinnerHelper.COLUMN_ID + "=" + id, null, null, null, null);
return cursor.moveToNext() ? cursor.getString(0) : null;
}
// добавить запись в DB_TABLE
public void addSpinnerRec(String value) {
ContentValues cv = new ContentValues();
cv.put(DBSpinnerHelper.COLUMN_TIME_TASK, value);
dbase.insertWithOnConflict(DBSpinnerHelper.DB_TABLE, null, cv,SQLiteDatabase.CONFLICT_IGNORE);
}
// удалить запись из DB_TABLE
public void delSpinnerRec(int id) {
dbase.delete(DBSpinnerHelper.DB_TABLE, DBSpinnerHelper.COLUMN_ID + " = " + id, null);
delRecByTask(getSpinnerDataByTask(id));
}
}
Код: Выделить всё
package com.amizaar.businesstimer;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBDataHelper extends SQLiteOpenHelper {
private static final String TAG = "DBDataHelper";
public static final String DB_TABLE = "my_data_table";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_TIME_TASK = "time_task_spinner";
public static final String COLUMN_TIME = "time";
private static final String DB_CREATE =
"create table " + DB_TABLE + " (" +
COLUMN_ID + " integer primary key autoincrement, " +
COLUMN_TIME_TASK + " text, " +
COLUMN_TIME + " text);";
public DBDataHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
Log.d(TAG, "Construct");
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(DB_CREATE);
// db.execSQL("CREATE INDEX dataIndex ON " + DB_TABLE + " (" + COLUMN_TIME_TASK + ");");
ContentValues cv = new ContentValues();
cv.put(COLUMN_TIME_TASK, "...");
cv.put(COLUMN_TIME, "00:00:00:0");
db.insert(DB_TABLE, null, cv);
Log.d(TAG, "onCreate");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists " + DB_TABLE);
Log.d(TAG, "onUpdated");
onCreate(db);
}
}
Код: Выделить всё
package com.amizaar.businesstimer;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBSpinnerHelper extends SQLiteOpenHelper{
private static final String TAG = "DBSpinnerHelper";
public static final String DB_TABLE = "my_spinner_table";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_TIME_TASK = "time_task";
private static final String DB_CREATE =
"create table " + DB_TABLE + " (" +
COLUMN_ID + " integer primary key autoincrement, " +
COLUMN_TIME_TASK + " text);";
public DBSpinnerHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
Log.d(TAG, "Construct");
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(DB_CREATE);
ContentValues cv = new ContentValues();
cv.put(COLUMN_TIME_TASK, "...");
db.insert(DB_TABLE, null, cv);
// db.execSQL("CREATE UNIQUE INDEX tasksIndex ON " + DB_TABLE + " (" + COLUMN_TIME_TASK + ");");
Log.d(TAG, "onCreate");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists " + DB_TABLE);
Log.d(TAG, "onUpdated");
onCreate(db);
}
}