Страница 1 из 1

Работа с SQLite. Прослемы с обновлением и выборкой.

Добавлено: 05 июн 2013, 13:12
Amizaar
Добрый день.
Помогите, пожалуйста, разобраться в 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();
		  }
****
При этом если указать новый DB_VERSION, обновляется только 1я таблица (смотрю по LogCat), у 2й вызывается лишь 1 конструктор.

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);
		  } 
прекрасно происходит если task - число, но если task = "test1" или др. текст, получаю сообщение

Код: Выделить всё

sqlite returned: error code = 1, msg = no such column: test1
При полном переборе данных в таблице вижу, что данные test1 там есть, но ошибка возникает. Вместо "like" ставил "=", результат тот же. в БД поле точно текстовое (text). Есть какое-то правило на выбор текстовых полей?

Полный код классов:

Код: Выделить всё

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

Re: Работа с SQLite. Прослемы с обновлением и выборкой.

Добавлено: 05 июн 2013, 13:17
Foenix
если 2 БД - то нужно два класса, или у вас 2 таблицы все-таки?

Re: Работа с SQLite. Прослемы с обновлением и выборкой.

Добавлено: 05 июн 2013, 13:18
Amizaar
Foenix писал(а):если 2 БД - то нужно два класса, или у вас 2 таблицы все-таки?
1БД с 2мя таблицами
исправил описание.

Re: Работа с SQLite. Прослемы с обновлением и выборкой.

Добавлено: 05 июн 2013, 14:32
Amizaar
Такс, со 2й проблемой разобрался:
Вместо
dbase.query(DBDataHelper.DB_TABLE, DB_TEXT_COLUMNS1, DBDataHelper.COLUMN_TIME_TASK + " like " + task, null, null, null, null);
dbase.query(DBDataHelper.DB_TABLE, DB_TEXT_COLUMNS1, DBDataHelper.COLUMN_TIME_TASK + " ='" + task + "'", null, null, null, null);
нужно еще кавычки было добавить.

Re: Работа с SQLite. Прослемы с обновлением и выборкой.

Добавлено: 05 июн 2013, 14:36
Foenix
вообще неплохо было бы подправить постановку задачи
твой хэлпер работает судя по коду всего с одной таблицей, с какой радости оно должно обновлять вторую?
по второму вопросу - попробуй сформулировать запрос через rawQuery как в 37 уроке, там намного нагляднее, можно в лог выдать сам запрос и посмотреть на что он похож. Скорее всего там кавычек не хватает (Строку нужно брать в кавычки) и кроме того смысл like можете объяснить в данном случае?

Re: Работа с SQLite. Прослемы с обновлением и выборкой.

Добавлено: 05 июн 2013, 14:37
Foenix
еще вопрос.. в колонке COLUMNS1 русские буквы намечаются?

Re: Работа с SQLite. Прослемы с обновлением и выборкой.

Добавлено: 05 июн 2013, 14:53
Amizaar
Нет, русских букв там нет. 2ю проблему решил, там и правда кавычек не было.

А хэлперов у меня 2 - на 2 класса (dbDataHelper и dbSpinnerHelper ), одна у меня БД dbase = dbDataHelper.getWritableDatabase();

Re: Работа с SQLite. Прослемы с обновлением и выборкой.

Добавлено: 05 июн 2013, 14:58
Foenix
так а like зачем?

Re: Работа с SQLite. Прослемы с обновлением и выборкой.

Добавлено: 05 июн 2013, 15:03
Foenix
в классах конечно каша. Хелпер должен быть один, а вот на таблицы можешь свои классы заводить. В ОДНОМ хэлпере в онапгрейд опиши апгрейд обоих таблиц. В классах таблиц оставь методы классов- всякие выборки и проч.

Re: Работа с SQLite. Прослемы с обновлением и выборкой.

Добавлено: 05 июн 2013, 15:08
Amizaar
like я пробовал, так как с "=" не работало :)
Все, я кажись понял. Хотел сделать 2 таблицы в 1 БД, чтобы не создавать 2 БД, совместил методы для работы с таблицами в 1 класс, а нужно было совместить методы создания и обновления в 1 SQLiteOpenHelper.
Все, спасибо, сейчас переделаю.