Урок 35. SQLite. Методы update и delete с указанием условия

Обсуждение уроков
NaumOff
Сообщения: 4
Зарегистрирован: 16 сен 2012, 12:14

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение NaumOff » 16 сен 2012, 12:20

Всем привет.
А как провести соответствие между пунктами списка и записями в БД? Допустим хочу удалить первую запись. Вызываю контекстное меню, по позиции view удаляю запись в бд. Но после этого позиции в списке перестают соответстовать id в БД.
Еще один вопрос, как получить определенную запись по ее ID? Погуглил в рунете... все статьи про работы с MySQL в Андроид-перепечатки одного и того же источника, и в них работа ведется со всеми записями в таблице одновременно.
П.С. Со вторым вопросом разобрался. Постоянно ловил эксепшн, оказалось что по умолчанию позиция в курсоре = -1. moveToNext() решает.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение rezak90 » 16 сен 2012, 15:26

А как провести соответствие между пунктами списка и записями в БД? Допустим хочу удалить первую запись. Вызываю контекстное меню, по позиции view удаляю запись в бд. Но после этого позиции в списке перестают соответстовать id в БД.
для этого необходимо юзать SimpleCursorAdapter и тогда не будет необходимости вообще думать о соответствии айди листа и айди таблицы. И не забывайте после удаления данных с таблицы делать notifyDataSetChanged()
R.id.team
Политика на форуме запрещена

NaumOff
Сообщения: 4
Зарегистрирован: 16 сен 2012, 12:14

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение NaumOff » 16 сен 2012, 16:47

SimpleCursorAdapter у меня кастомный. Удаляю через контекстное меню:

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

public boolean onContextItemSelected(MenuItem item) {
		AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item
				.getMenuInfo();
		switch (item.getItemId()) {
		case CM_DELETE_ID:
			db.delRec(acmi.position);
			cursor.requery();
			return true;
		}
		return super.onContextItemSelected(item);
	}
В адаптере удаляю запись так:

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

public void delRec(long id) {
		mDB.delete(DB_TABLE, COLUMN_ID + " = " + id, null);
	}
Явно делаю не так как надо. acmi.position совсем не равно COLUMN_ID записи.
Кстати в onItemClick(AdapterView<?> parent, View view, int position, long id) long id то что надо - _id записи.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение rezak90 » 16 сен 2012, 17:25

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

onItemClick(AdapterView<?> parent, View view, int position, long id)
position - айди позиции в listview
id - айди в базе данных
они и не должны быть равны
R.id.team
Политика на форуме запрещена

NaumOff
Сообщения: 4
Зарегистрирован: 16 сен 2012, 12:14

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение NaumOff » 16 сен 2012, 17:35

Это все понятно:) Вопрос в том, как через контекстное меню удалять записи. Одна из моих идей - запоминать _id в tag пункта списка и по нему удалять записи. Но чувствую можно проще.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение neoksi » 16 сен 2012, 18:05

Вам необходимо предусмотреть в своем адаптере метод, который по позиции будет возвращать id записи, и не нужно пытаться делать велосипед через TAG.
Сразу скажу, вы не одиноки, у самого первая мысль была передавать через TAG, пока не прочитал все про создание адаптеров.

NaumOff
Сообщения: 4
Зарегистрирован: 16 сен 2012, 12:14

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение NaumOff » 16 сен 2012, 18:44

rezak90, neoksi, ребята, спасибо за помощь.
В адаптере добавил вот такой метод получения _id записи по position в списке:

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

public long getID(int position){
		return this.getItemId(position);
	}

kudri
Сообщения: 5
Зарегистрирован: 01 окт 2012, 16:05

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение kudri » 22 окт 2012, 17:00

Ну и я спрошу немного :D
хотелось бы знать, что это за параметр:
int updCount = db.update("mytable", cv, "id = ?", new String[] { id });
а то по написанному в уроке не очень понял.
И еще, если я например дальше буду обновлять приложение, БД будет оставаться с данными, или будет тож обновляться, данные не будут теряться?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение damager82 » 23 окт 2012, 17:45

kudri писал(а):хотелось бы знать, что это за параметр:
int updCount = db.update("mytable", cv, "id = ?", new String[] { id });
Это значения, для предыдущего параметра: строки "id = ?"
Значения из массива будут подставлены вместо знаков ? в строку условия.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение damager82 » 23 окт 2012, 17:47

kudri писал(а):если я например дальше буду обновлять приложение, БД будет оставаться с данными, или будет тож обновляться, данные не будут теряться?
Изменение приложения не повлияет на структуру БД. Данные будут хранится, читаться и записываться.
А вот если надумаете менять структуру БД, то там уже придется предусмотреть процедуру обновления. Об этом в Уроке 39.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение powercat » 07 ноя 2012, 12:58

Я делаю апдейт по аргументу - _id записи в базе, помещаю этот аргумент в массив и указываю "_id=?".....тут все работает, все понятно.
НО - я что-то не понимаю, как это, когда несколько данных в массиве аргументов для апдейта...можно ли привести пример? Как это, когда несколько знаков вопроса пишется и что это в реальности, т.е. что это за аргументы? Правильно ли я понимаю, что это выглядит так - апдейтить запись, у которой выполняются условия - {условие 1, условия 2, условия 3}

Kalim32rus
Сообщения: 7
Зарегистрирован: 24 ноя 2012, 22:41

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение Kalim32rus » 26 ноя 2012, 22:26

очень хотелось бы спросить по поводу ошибок, их сильно много

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

11-26 23:20:19.108: I/SqliteDatabaseCpp(10327): sqlite returned: error code = 1, msg = table mytable has no column named addresse, db=/data/data/kalim.firstsql/databases/myDB2
11-26 23:20:19.118: E/SQLiteDatabase(10327): Error inserting addresse=f other_information= education=g telephone=5 email=r name=g
11-26 23:20:19.118: E/SQLiteDatabase(10327): android.database.sqlite.SQLiteException: table mytable has no column named addresse: , while compiling: INSERT INTO mytable(addresse,other_information,education,telephone,email,name) VALUES (?,?,?,?,?,?)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:68)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:260)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:112)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1718)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1591)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at kalim.firstsql.MainActivity.onClick(MainActivity.java:95)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at android.view.View.performClick(View.java:3534)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at android.view.View$PerformClick.run(View.java:14263)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at android.os.Handler.handleCallback(Handler.java:605)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at android.os.Handler.dispatchMessage(Handler.java:92)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at android.os.Looper.loop(Looper.java:137)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at android.app.ActivityThread.main(ActivityThread.java:4441)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at java.lang.reflect.Method.invokeNative(Native Method)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at java.lang.reflect.Method.invoke(Method.java:511)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-26 23:20:19.118: E/SQLiteDatabase(10327): 	at dalvik.system.NativeStart.main(Native Method)
11-26 23:20:19.118: D/myLogs(10327): row inserted, ID = -1
Код программы:
main.xml

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    /*<LinearLayout
        android:id="@+id/linearLayout4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="25dp"
            android:text="ID" >
        </TextView>

        <EditText
            android:id="@+id/etID"
            android:layout_width="70dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp" >
        </EditText>

        <Button
            android:id="@+id/btnUpd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Update" >
        </Button>

        <Button
            android:id="@+id/btnDel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Delete" >
        </Button>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:text="Name" >
        </TextView>

        <EditText
            android:id="@+id/etName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" >

            <requestFocus>
            </requestFocus>
        </EditText>*/
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:text="Email" >
        </TextView>

        <EditText
            android:id="@+id/etEmail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="2.41"
            android:ems="10"
            android:inputType="textEmailAddress" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Telephone" />

        <EditText
            android:id="@+id/etPhone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="phone" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Address" />

        <EditText
            android:id="@+id/etAddresse"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textPostalAddress" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Education" />

        <EditText
            android:id="@+id/etEdu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textMultiLine" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/textView5"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Other informations"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <EditText
            android:id="@+id/etOInf"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="textMultiLine" />

    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/btnAdd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add" />

        <Button
            android:id="@+id/btnRead"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Read" />

        <Button
            android:id="@+id/btnClear"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Clear" />
    </LinearLayout>

</LinearLayout>
MainActivity.java

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

package ru.startandroid.develop.p0341simplesqlite;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity implements OnClickListener {

  final String LOG_TAG = "myLogs";

  Button btnAdd, btnRead, btnClear, btnUpd, btnDel;
  EditText etName, etEmail, etID, etPhone, etAddresse, etEdu, etOInf ;

  DBHelper dbHelper;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    btnAdd = (Button) findViewById(R.id.btnAdd);
    btnAdd.setOnClickListener(this);

    btnRead = (Button) findViewById(R.id.btnRead);
    btnRead.setOnClickListener(this);

    btnClear = (Button) findViewById(R.id.btnClear);
    btnClear.setOnClickListener(this);
    
    btnUpd = (Button) findViewById(R.id.btnUpd);
    btnUpd.setOnClickListener(this);

    btnDel = (Button) findViewById(R.id.btnDel);
    btnDel.setOnClickListener(this);
    
    etName = (EditText) findViewById(R.id.etName);
    etEmail = (EditText) findViewById(R.id.etEmail);
    etID = (EditText) findViewById(R.id.etID);
    etPhone = (EditText) findViewById(R.id.etPhone); 
    etAddresse = (EditText) findViewById(R.id.etAddresse);
    etEdu = (EditText) findViewById(R.id.etEdu);
    etOInf = (EditText) findViewById(R.id.etOInf);
    
    // создаем объект для создания и управления версиями БД
    dbHelper = new DBHelper(this);
  }

  
  @Override
  public void onClick(View v) {
    
    // создаем объект для данных
    ContentValues cv = new ContentValues();
    
    // получаем данные из полей ввода
    String name = etName.getText().toString();
    String email = etEmail.getText().toString();
    String id = etID.getText().toString();
    String phone = etPhone.getText().toString();
    String addresse = etAddresse.getText().toString();
    String education = etEdu.getText().toString();
    String other_inf = etOInf.getText().toString();
    

    // подключаемся к БД
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    

    switch (v.getId()) {
    
    case R.id.btnAdd:
      Log.d(LOG_TAG, "--- Insert in mytable: ---");
      // подготовим данные для вставки в виде пар: наименование столбца - значение
      
      cv.put("name", name);
      cv.put("email", email);
      cv.put("telephone", phone);
      cv.put("addresse", addresse);
      cv.put("education", education);
      cv.put("other_information", other_inf);
      
      // вставляем запись и получаем ее ID
      long rowID = db.insert("mytable", null, cv);
      Log.d(LOG_TAG, "row inserted, ID = " + rowID);
      break;
    
    case R.id.btnRead:
      Log.d(LOG_TAG, "--- Rows in mytable: ---");
      
      // делаем запрос всех данных из таблицы mytable, получаем Cursor 
      Cursor c = db.query("mytable", null, null, null, null, null, null, null);

      // ставим позицию курсора на первую строку выборки
      // если в выборке нет строк, вернется false
      if (c.moveToFirst()) {

        // определяем номера столбцов по имени в выборке
        int idColIndex = c.getColumnIndex("id");
        int nameColIndex = c.getColumnIndex("name");
        int emailColIndex = c.getColumnIndex("email");
        int telephoneColIndex = c.getColumnIndex("telephone");
        int addresseColIndex = c.getColumnIndex("addresse");
        int educationColIndex = c.getColumnIndex("education");
        int other_infColIndex = c.getColumnIndex("other_inf");

        do {
          // получаем значения по номерам столбцов и пишем все в лог
          Log.d(LOG_TAG,
              "ID = " + c.getInt(idColIndex) + 
              ", name = " + c.getString(nameColIndex) + 
              ", email = " + c.getString(emailColIndex)+
              ", telephone ="+c.getString(telephoneColIndex)+
              ", addresse = "+c.getString(addresseColIndex)+
              ", education=" +c.getString(educationColIndex)+
              ", other_informations=" +c.getString(other_infColIndex));
          // переход на следующую строку 
          // а если следующей нет (текущая - последняя), то false - выходим из цикла
        } while (c.moveToNext());
      } else
        Log.d(LOG_TAG, "0 rows");
      c.close();
      break;
    
    case R.id.btnClear:
      Log.d(LOG_TAG, "--- Clear mytable: ---");
      // удаляем все записи
      int clearCount = db.delete("mytable", null, null);
      Log.d(LOG_TAG, "deleted rows count = " + clearCount);
      break;
   
    case R.id.btnUpd:
        if (id.equalsIgnoreCase("")) {
          break;
        }
        Log.d(LOG_TAG, "--- Update mytabe: ---");
        
        // подготовим значения для обновления
        cv.put("name", name);
        cv.put("email", email);
        cv.put("telephone", phone);
        cv.put("addresse", addresse);
        cv.put("education", education);
        cv.put("other_information", other_inf);
       
        // обновляем по id
        int updCount = db.update("mytable", cv, "id = ?",
            new String[] { id });
        Log.d(LOG_TAG, "updated rows count = " + updCount);
        break;
      case R.id.btnDel:
        if (id.equalsIgnoreCase("")) {
          break;
        }
        Log.d(LOG_TAG, "--- Delete from mytabe: ---");
        // удаляем по id
        int delCount = db.delete("mytable", "id = " + id, null);
        Log.d(LOG_TAG, "deleted rows count = " + delCount);
        break;
      }
    // закрываем подключение к БД
    dbHelper.close();
  }
  
  

  class DBHelper extends SQLiteOpenHelper {

    public DBHelper(Context context) {
      // конструктор суперкласса
      super(context, "myDB2", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
      Log.d(LOG_TAG, "--- onCreate database ---");
      
      // создаем таблицу с полями
      db.execSQL("create table mytable ("
          + "id integer primary key autoincrement," 
          + "name text,"
          + "email text"
          + "telephone text"
          +	"addresse text"
          + "education text"
          + "other_information text" + ");");
    }
    

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
  }

}

из-за чего возникает данная ошибка и как с ней можно бороться, ведь нужный столбец я создаю?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение rezak90 » 26 ноя 2012, 23:38

у вас запятых нету при создании таблицы (смотрите внимательно после email text и т.д.)))) вот она и не создаёт
R.id.team
Политика на форуме запрещена

Kalim32rus
Сообщения: 7
Зарегистрирован: 24 ноя 2012, 22:41

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение Kalim32rus » 27 ноя 2012, 11:50

rezak90 писал(а):у вас запятых нету при создании таблицы (смотрите внимательно после email text и т.д.)))) вот она и не создаёт
запятые я расставил, но всё равно ошибка сохраняется

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение rezak90 » 27 ноя 2012, 12:24

убейте приложение и все данные связанные с ней с эмулятора/телефона, может вы то раставили запятые, но бд существует и таблица уже не создаётся, а её нужно пересоздать
R.id.team
Политика на форуме запрещена

Kalim32rus
Сообщения: 7
Зарегистрирован: 24 ноя 2012, 22:41

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение Kalim32rus » 27 ноя 2012, 16:25

rezak90 писал(а):убейте приложение и все данные связанные с ней с эмулятора/телефона, может вы то раставили запятые, но бд существует и таблица уже не создаётся, а её нужно пересоздать
спасибо большое, помогло, но при нажатии кнопки Read (уже есть 2 тестовых записи), приложение вываливается, в дебаге пишет вот это

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

11-27 17:24:28.300: D/TextLayoutCache(32009): Using debug level: 0 - Debug Enabled: 0
11-27 17:24:31.370: D/myLogs(32009): --- Rows in mytable: ---
11-27 17:24:31.370: E/CursorWindow(32009): Failed to read row 0, column -1 from a CursorWindow which has 1 rows, 7 columns.
11-27 17:24:31.370: D/AndroidRuntime(32009): Shutting down VM
11-27 17:24:31.370: W/dalvikvm(32009): threadid=1: thread exiting with uncaught exception (group=0x2b542210)
11-27 17:24:31.380: E/AndroidRuntime(32009): FATAL EXCEPTION: main
11-27 17:24:31.380: E/AndroidRuntime(32009): java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
11-27 17:24:31.380: E/AndroidRuntime(32009): 	at android.database.CursorWindow.nativeGetString(Native Method)
11-27 17:24:31.380: E/AndroidRuntime(32009): 	at android.database.CursorWindow.getString(CursorWindow.java:442)
11-27 17:24:31.380: E/AndroidRuntime(32009): 	at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
11-27 17:24:31.380: E/AndroidRuntime(32009): 	at kalim.firstsql.MainActivity.onClick(MainActivity.java:125)
11-27 17:24:31.380: E/AndroidRuntime(32009): 	at android.view.View.performClick(View.java:3534)
11-27 17:24:31.380: E/AndroidRuntime(32009): 	at android.view.View$PerformClick.run(View.java:14263)
11-27 17:24:31.380: E/AndroidRuntime(32009): 	at android.os.Handler.handleCallback(Handler.java:605)
11-27 17:24:31.380: E/AndroidRuntime(32009): 	at android.os.Handler.dispatchMessage(Handler.java:92)
11-27 17:24:31.380: E/AndroidRuntime(32009): 	at android.os.Looper.loop(Looper.java:137)
11-27 17:24:31.380: E/AndroidRuntime(32009): 	at android.app.ActivityThread.main(ActivityThread.java:4441)
11-27 17:24:31.380: E/AndroidRuntime(32009): 	at java.lang.reflect.Method.invokeNative(Native Method)
11-27 17:24:31.380: E/AndroidRuntime(32009): 	at java.lang.reflect.Method.invoke(Method.java:511)
11-27 17:24:31.380: E/AndroidRuntime(32009): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-27 17:24:31.380: E/AndroidRuntime(32009): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-27 17:24:31.380: E/AndroidRuntime(32009): 	at dalvik.system.NativeStart.main(Native Method)
в etId записываю значение 2 и нажимаю кнопку Read
Последний раз редактировалось Kalim32rus 27 ноя 2012, 17:27, всего редактировалось 1 раз.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение damager82 » 27 ноя 2012, 16:58

Kalim32rus писал(а):но при нажатии кнопки Read (уже есть 2 тестовых записи), приложение вываливается, в дебаге пишет вот это
Вы создаете столбец other_information, а читать пытаетесь из other_inf. У курсора есть вполне обоснованные претензии по этому поводу )
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Kalim32rus
Сообщения: 7
Зарегистрирован: 24 ноя 2012, 22:41

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение Kalim32rus » 27 ноя 2012, 17:27

damager82 писал(а):
Kalim32rus писал(а):но при нажатии кнопки Read (уже есть 2 тестовых записи), приложение вываливается, в дебаге пишет вот это
Вы создаете столбец other_information, а читать пытаетесь из other_inf. У курсора есть вполне обоснованные претензии по этому поводу )
спасибо, проблему решил, в отладчике всё красиво, последний вопрос: можно ли как то организовать вывод в те строки, откуда идёт считывание данных для занесения в таблицу? какой урок посмотреть?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение damager82 » 27 ноя 2012, 17:34

Kalim32rus писал(а):можно ли как то организовать вывод в те строки, откуда идёт считывание данных для занесения в таблицу? какой урок посмотреть?
Вопрос не оч понятен. Типа есть EditText, из него берем значение, по этому значению выбираем данные из БД и вставляем их в этот же EditText - так чтоль?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Kalim32rus
Сообщения: 7
Зарегистрирован: 24 ноя 2012, 22:41

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение Kalim32rus » 27 ноя 2012, 19:59

damager82 писал(а):
Kalim32rus писал(а):можно ли как то организовать вывод в те строки, откуда идёт считывание данных для занесения в таблицу? какой урок посмотреть?
Вопрос не оч понятен. Типа есть EditText, из него берем значение, по этому значению выбираем данные из БД и вставляем их в этот же EditText - так чтоль?
принцип такой, у нас есть второй activity и в него мы должны вывести(сейчас только придумал) TextView может быть один всего, но данные нужно как-то структурировать, мне интересен вывод данных применительно к Вашему примеру

Ответить