Страница 1 из 2
Ошибка чтения данных из БД
Добавлено: 17 июл 2014, 21:45
Loreny
Есть база данных
Код: Выделить всё
CREATE TABLE table (
_id INTEGER PRIMARY KEY AUTOINCREMENT,
idParent INTEGER NOT NULL,
title TEXT NOT NULL
);
И есть в неё запрос
Код: Выделить всё
SELECT _id FROM table WHERE title = "*******";
Пытаясь получить значение этого самого _id через
Код: Выделить всё
cursor.getInt(cursor.getColumnIndex("_id"));
приложение просто вылетает с ошибкой, хотя записи есть.
А запрос
Код: Выделить всё
SELECT title FROM table WHERE idParent = "*******";
возвращая курсор спокойно разрешает обращаться
Код: Выделить всё
cursor.getString(cursor.getColumnIndex("title"));
Re: Ошибка чтения данных из БД
Добавлено: 17 июл 2014, 22:08
Foenix
с какой ошибкой?? лог полностью пожалуйста.
Re: Ошибка чтения данных из БД
Добавлено: 17 июл 2014, 22:23
Loreny
Код: Выделить всё
07-17 22:22:36.626 15624-15624/com.leteam.materialgroup E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.leteam.materialgroup, PID: 15624
android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426)
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:68)
at com.leteam.materialgroup.Connect.getGroupList(Connect.java:105)
at com.leteam.materialgroup.MainActivity$1.onItemClick(MainActivity.java:70)
at android.widget.AdapterView.performItemClick(AdapterView.java:299)
at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2911)
at android.widget.AbsListView$3.run(AbsListView.java:3645)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5086)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
Re: Ошибка чтения данных из БД
Добавлено: 17 июл 2014, 22:30
Foenix
ну лог не полный
и код куски не ясно - может у тебя где-то в другом месте ошибка)
Посмотри полностью лог, где стек указан и код с ошибкой.
Re: Ошибка чтения данных из БД
Добавлено: 17 июл 2014, 22:36
Loreny
ошибка конкретно в этой строке:
cursor.getInt(cursor.getColumnIndex("_id"));
ссылка ведет к ней, если убрать cursor.getInt, тогда ошибки нет, но соответственно и не выводит данные из этого поля.
код:
Код: Выделить всё
package com.leteam.materialgroup;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.provider.BaseColumns;
import android.util.Log;
import java.io.InputStream;
public class Connect implements BaseColumns
{
private static Connect instance;
private SQLiteDatabase sqLiteDatabase;
DBHelper dbHelper;
int parentId;
private int[] stack = new int[10];
private int stackTop;
final String LOG_TAG = "myLogs";
private Connect(Context context, InputStream inputStream)
{
Log.d(LOG_TAG, "Создаю скрипт");
SqlScript sqlScript = new SqlScript(inputStream);
Log.d(LOG_TAG, "Создаю DBHelper");
dbHelper = new DBHelper(context, sqlScript);
Log.d(LOG_TAG, "Подключаюсь к базе данных");
sqLiteDatabase = dbHelper.getWritableDatabase();
Log.d(LOG_TAG, "Включаю настройки PRAGMA");
sqLiteDatabase.execSQL("PRAGMA read_uncommitted = true;");
sqLiteDatabase.execSQL("PRAGMA defer_foreign_keys = true;");
sqLiteDatabase.execSQL("PRAGMA foreign_keys = true;");
reset();
}
public void stop()
{
sqLiteDatabase.close();
dbHelper.close();
Log.d(LOG_TAG, "Отключился от базы данных");
}
public static Connect start(Context context,InputStream inputStream)
{
if (instance == null)
{
instance = new Connect(context, inputStream);
}
return instance;
}
public void reset()
{
stack[0] = 0;
parentId = 0;
stackTop = 1;
}
private void push(int id)
{
if (stackTop < 9)
{
stack[stackTop] = id;
stackTop++;
}
}
private void pop()
{
stack[stackTop] = 0;
if (stackTop > 1)
stackTop--;
}
private int peek()
{
return stack[stackTop];
}
public int getParentId()
{
return parentId;
}
public String[] getGroupList(String table, String title)
{
Cursor cursor;
String[] titles = new String[] {};
String sql = "SELECT title FROM " + table +
" WHERE idParent = " + peek() +
" AND _id != 0";
if (title == null)
{
cursor = sqLiteDatabase.rawQuery(sql, null);
pop();
} else
{
// SELECT _id FROM " + table + " WHERE title = " + title + " AND idParent = " + peek();
cursor = sqLiteDatabase.query(table, new String[]{ _ID}, "title = ? AND idParent = ?",
new String[]{title, String.valueOf(peek())}, null, null, null);
if (cursor.getCount() == 0) return titles;
Log.d(LOG_TAG, String.valueOf(cursor.getInt(cursor.getColumnIndex("*"))));
parentId = cursor.getColumnIndex(cursor.getColumnName(0));
push(parentId);
cursor = sqLiteDatabase.rawQuery(sql, null);
}
int i = 0;
if (cursor.getCount() == 0) return titles;
titles = new String[cursor.getCount()];
if (cursor.moveToFirst())
{
do
{
titles[i] = cursor.getString(cursor.getColumnIndex("title"));
i++;
} while (cursor.moveToNext());
cursor.close();
}
return titles;
}
public void insertGroup(String table, String title)
{
ContentValues values = new ContentValues();
values.put("idParent", peek());
values.put("title", title);
long id = sqLiteDatabase.insert(table, null, values);
Log.d(LOG_TAG, String.valueOf("Запись добавлена (id = " + id + ")"));
}
public void deleteGroup(String table, String title)
{
long count = sqLiteDatabase.delete(table,"title = ? AND idParent = ?", new String[]{title, String.valueOf(peek())});
if (count > 1) Log.d(LOG_TAG, String.valueOf(count + " записей удалено"));
else Log.d(LOG_TAG, String.valueOf(count + " запись с title - \"" + title + "\" удалена"));
}
public void updateGroup(String table, String oldTitle, String newTitle)
{
ContentValues values = new ContentValues();
values.put("title", newTitle);
long count = sqLiteDatabase.update(table, values, "title = ? AND idParent = ?", new String[]{oldTitle, String.valueOf(peek())});
if (count > 1) Log.d(LOG_TAG, String.valueOf(count + " записей обновленно"));
else Log.d(LOG_TAG, String.valueOf("запись с title - \"" + oldTitle + "\" переименнована в \"" + newTitle +"\""));
}
}
Re: Ошибка чтения данных из БД
Добавлено: 17 июл 2014, 22:54
Foenix
это код, а полный лог?
Re: Ошибка чтения данных из БД
Добавлено: 17 июл 2014, 23:00
Foenix
и код хэлпера, где бд создается
Re: Ошибка чтения данных из БД
Добавлено: 17 июл 2014, 23:04
Foenix
и интересно, где у тебя в коде такая строка??
cursor.getInt(cursor.getColumnIndex("_id"));
Re: Ошибка чтения данных из БД
Добавлено: 17 июл 2014, 23:13
Эдуард
А у меня вопрос, не совсем конечно по теме, но все же... Cursor это интерфейс и как это так спокойно создается экземпляр интерфейса, и вызывается метод у которого по факту только заголовок есть?)
Re: Ошибка чтения данных из БД
Добавлено: 17 июл 2014, 23:15
Loreny
DBHelper:
Код: Выделить всё
package com.leteam.materialgroup;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class DBHelper extends SQLiteOpenHelper
{
final String LOG_TAG = "myLogs";
private SqlScript sqlScript;
public DBHelper(Context context, SqlScript sqlScript)
{
super(context, "PocketIC.db", null, 1);
this.sqlScript = sqlScript;
Log.d(LOG_TAG, "DBHelper создан");
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase)
{
Log.d(LOG_TAG, "Запускаю скрипт в методе onCreate");
sqlScript.runScript(sqLiteDatabase);
Log.d(LOG_TAG, "Скрипт завершен");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2)
{
Log.d(LOG_TAG, "Запускаю метод onCreate в методе onUpgrade");
List<String> tables = new ArrayList<String>();
Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM sqlite_master WHERE type='table'", null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
String tableName = cursor.getString(1);
if (!tableName.equals("android_metadata") &&
!tableName.equals("sqlite_sequence"))
tables.add(tableName);
cursor.moveToNext();
}
cursor.close();
for(String tableName:tables) {
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + tableName);
}
onCreate(sqLiteDatabase);
}
}
Connect:
Код: Выделить всё
package com.leteam.materialgroup;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.provider.BaseColumns;
import android.util.Log;
import java.io.InputStream;
public class Connect implements BaseColumns
{
private static Connect instance;
private SQLiteDatabase sqLiteDatabase;
DBHelper dbHelper;
int parentId;
private int[] stack = new int[10];
private int stackTop;
final String LOG_TAG = "myLogs";
private Connect(Context context, InputStream inputStream)
{
Log.d(LOG_TAG, "Создаю скрипт");
SqlScript sqlScript = new SqlScript(inputStream);
Log.d(LOG_TAG, "Создаю DBHelper");
dbHelper = new DBHelper(context, sqlScript);
Log.d(LOG_TAG, "Подключаюсь к базе данных");
sqLiteDatabase = dbHelper.getWritableDatabase();
Log.d(LOG_TAG, "Включаю настройки PRAGMA");
sqLiteDatabase.execSQL("PRAGMA read_uncommitted = true;");
sqLiteDatabase.execSQL("PRAGMA defer_foreign_keys = true;");
sqLiteDatabase.execSQL("PRAGMA foreign_keys = true;");
reset();
}
public void stop()
{
sqLiteDatabase.close();
dbHelper.close();
Log.d(LOG_TAG, "Отключился от базы данных");
}
public static Connect start(Context context,InputStream inputStream)
{
if (instance == null)
{
instance = new Connect(context, inputStream);
}
return instance;
}
public void reset()
{
stack[0] = 0;
parentId = 0;
stackTop = 1;
}
private void push(int id)
{
if (stackTop < 9)
{
stack[stackTop] = id;
stackTop++;
}
}
private void pop()
{
stack[stackTop] = 0;
if (stackTop > 1)
stackTop--;
}
private int peek()
{
return stack[stackTop];
}
public int getParentId()
{
return parentId;
}
public String[] getGroupList(String table, String title)
{
Cursor cursor;
String[] titles = new String[] {};
String sql = "SELECT title FROM " + table +
" WHERE idParent = " + peek() +
" AND _id != 0";
if (title == null)
{
cursor = sqLiteDatabase.rawQuery(sql, null);
pop();
} else
{
// SELECT _id FROM " + table + " WHERE title = " + title + " AND idParent = " + peek();
cursor = sqLiteDatabase.query(table, new String[]{ _ID}, "title = ? AND idParent = ?",
new String[]{title, String.valueOf(peek())}, null, null, null);
if (cursor.getCount() == 0) return titles;
Log.d(LOG_TAG, String.valueOf(cursor.getInt(cursor.getColumnIndex("*"))));
parentId = cursor.getColumnIndex(cursor.getColumnName(0));
push(parentId);
cursor = sqLiteDatabase.rawQuery(sql, null);
}
int i = 0;
if (cursor.getCount() == 0) return titles;
titles = new String[cursor.getCount()];
if (cursor.moveToFirst())
{
do
{
titles[i] = cursor.getString(cursor.getColumnIndex("title"));
i++;
} while (cursor.moveToNext());
cursor.close();
}
return titles;
}
public void insertGroup(String table, String title)
{
ContentValues values = new ContentValues();
values.put("idParent", peek());
values.put("title", title);
long id = sqLiteDatabase.insert(table, null, values);
Log.d(LOG_TAG, String.valueOf("Запись добавлена (id = " + id + ")"));
}
public void deleteGroup(String table, String title)
{
long count = sqLiteDatabase.delete(table,"title = ? AND idParent = ?", new String[]{title, String.valueOf(peek())});
if (count > 1) Log.d(LOG_TAG, String.valueOf(count + " записей удалено"));
else Log.d(LOG_TAG, String.valueOf(count + " запись с title - \"" + title + "\" удалена"));
}
public void updateGroup(String table, String oldTitle, String newTitle)
{
ContentValues values = new ContentValues();
values.put("title", newTitle);
long count = sqLiteDatabase.update(table, values, "title = ? AND idParent = ?", new String[]{oldTitle, String.valueOf(peek())});
if (count > 1) Log.d(LOG_TAG, String.valueOf(count + " записей обновленно"));
else Log.d(LOG_TAG, String.valueOf("запись с title - \"" + oldTitle + "\" переименнована в \"" + newTitle +"\""));
}
}
MainActivity:
Код: Выделить всё
package com.leteam.materialgroup;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.io.IOException;
public class MainActivity extends Activity implements BaseColumns
{
final String LOG_TAG = "myLogs";
Toast toast;
AlertDialog.Builder ad;
private final int IDD = 1;
int i = 1;
ListView lvMain;
Connect connect;
String[] titles = {};
public static final int IDM_OPEN = 101;
int rez;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lvMain = (ListView) findViewById(R.id.lvMain);
registerForContextMenu(lvMain);
Log.d(LOG_TAG, "Подключаю класс Connect");
try
{
connect = Connect.start(this, getAssets().open("Create.sql"));
}
catch (IOException e)
{
e.printStackTrace();
}
onRestart();
lvMain.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
{
long timeout = System.currentTimeMillis();
Log.d(LOG_TAG, "itemClick: position = " + position + ", id = " + id + "test=" + titles[position]);
/*Здесь надо получить новые значения в name*/
titles = connect.getGroupList("S_MaterialsGroup", titles[position]);
if ((titles == null) && (connect.getParentId() != 0))
{
titles = connect.getGroupList("S_Materials", titles[position]);
}
ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(
getApplicationContext(), R.layout.item_list, titles/*ЗДЕСЬ НОВЫЙ МАСИВ ПЕРЕПРИСВАИВАЕТСЯ*/);
lvMain.setAdapter(adapter1);
timeout = System.currentTimeMillis() - timeout;
Log.d(LOG_TAG, "time=" + timeout);
}
});
lvMain.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()
{
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
rez=i;
return false;
}
});
}
protected Dialog onCreateDialog(int id) {
switch (id) {
case IDD:
final String[] mName = {"Группу", "Материал"};
ad = new AlertDialog.Builder(this);
ad.setTitle("Добавить:"); // заголовок для диалога
ad.setNeutralButton("Назад",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int id) {
dialog.cancel();
}
});
ad.setItems(mName, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
// TODO Auto-generated method stub
switch (item){
case 0:
Intent intent = new Intent(MainActivity.this, Add_Group.class);
startActivity(intent);
break;
case 1: Toast.makeText(getApplicationContext(), "Выбранный вариант: " + mName[item], Toast.LENGTH_SHORT).show();
break;
}
}
});
ad.setCancelable(false);
return ad.create();
default:
return null;
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Удалить");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// CharSequence message;
switch (item.getItemId())
{
case IDM_OPEN:
connect.deleteGroup("S_MaterialsGroup",titles[rez]);
onRestart();
// Log.d(LOG_TAG, String.valueOf(rez));
break;
// case IDM_SAVE:
// message = "Выбран пункт Сохранить";
// break;
default:
return super.onContextItemSelected(item);
}
// Toast toast = Toast.makeText(this, message, Toast.LENGTH_SHORT);
// toast.setGravity(Gravity.CENTER, 0, 0);
// toast.show();
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.action_items, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.menu_save:
toast = Toast.makeText(getApplicationContext(), "Вы нажали элемент Добавить", Toast.LENGTH_SHORT);
toast.show();
showDialog(IDD);
return true;
case R.id.menu_delete:
toast = Toast.makeText(getApplicationContext(), "Вы нажали элемент Удалить", Toast.LENGTH_SHORT);
toast.show();
return true;
default:
return false;
}
}
@Override
public void onBackPressed() {
if (i == 0)
{
super.onBackPressed();
} else
{
Log.d(LOG_TAG, "i=" + i);
i = i - 1;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
connect.stop();
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "Делаю запрос");
titles = connect.getGroupList("S_MaterialsGroup", null);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this, R.layout.item_list, titles/*ЗДЕСЬ МАССИВ ИЗ TITLE*/);
lvMain.setAdapter(adapter);
}
}
Re: Ошибка чтения данных из БД
Добавлено: 18 июл 2014, 08:01
Foenix
скрипты таблиц не вижу.
Re: Ошибка чтения данных из БД
Добавлено: 18 июл 2014, 15:44
KamiSempai
Эдуард писал(а):А у меня вопрос, не совсем конечно по теме, но все же... Cursor это интерфейс и как это так спокойно создается экземпляр интерфейса, и вызывается метод у которого по факту только заголовок есть?)
На самом деле создается объект реализующий этот интерфейс. Просто с интерфейсом можно работать не задумываясь о его реализации, ведь курсор может и не быть частью базы данных как, например, MatrixCursor.
Re: Ошибка чтения данных из БД
Добавлено: 18 июл 2014, 17:27
Эдуард
Foenix писал(а):скрипты таблиц не вижу.
А это так важно? Человек же русским языком написал что убрав cursor.getInt() приложение начинает работать без ошибок и даже возвращает "0", но попытка взятия самих данных из этого столбца приводит к ошибке CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1 ... Именно поэтому я и спросил за Cursor, ведь выходит что объект реализующий этот интерфейс создается неявно и не разработчиком, и посмотреть код реализации cursor.getInt() невозможно.
Re: Ошибка чтения данных из БД
Добавлено: 18 июл 2014, 18:10
altwin
Эдуард писал(а):. Именно поэтому я и спросил за Cursor, ведь выходит что объект реализующий этот интерфейс создается неявно и не разработчиком, и посмотреть код реализации cursor.getInt() невозможно.
Учите основы java. Объект создается как обычно, Cursor в данном случае родитель а смотреть метод getInt вам вообще зачем?
А это так важно?
принципиально, и особенно с учетом того, что весь код в этой теме левые обрезки из которых нифига не понятно.
Re: Ошибка чтения данных из БД
Добавлено: 18 июл 2014, 18:14
altwin
Loreny писал(а):DBHelper:
Код: Выделить всё
package com.leteam.materialgroup;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class DBHelper extends SQLiteOpenHelper
{
final String LOG_TAG = "myLogs";
private SqlScript sqlScript;
public DBHelper(Context context, SqlScript sqlScript)
{
super(context, "PocketIC.db", null, 1);
this.sqlScript = sqlScript;
Log.d(LOG_TAG, "DBHelper создан");
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase)
{
Log.d(LOG_TAG, "Запускаю скрипт в методе onCreate");
sqlScript.runScript(sqLiteDatabase);
Log.d(LOG_TAG, "Скрипт завершен");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2)
{
Log.d(LOG_TAG, "Запускаю метод onCreate в методе onUpgrade");
List<String> tables = new ArrayList<String>();
Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM sqlite_master WHERE type='table'", null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
String tableName = cursor.getString(1);
if (!tableName.equals("android_metadata") &&
!tableName.equals("sqlite_sequence"))
tables.add(tableName);
cursor.moveToNext();
}
cursor.close();
for(String tableName:tables) {
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + tableName);
}
onCreate(sqLiteDatabase);
}
}
Connect:
Код: Выделить всё
package com.leteam.materialgroup;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.provider.BaseColumns;
import android.util.Log;
import java.io.InputStream;
public class Connect implements BaseColumns
{
private static Connect instance;
private SQLiteDatabase sqLiteDatabase;
DBHelper dbHelper;
int parentId;
private int[] stack = new int[10];
private int stackTop;
final String LOG_TAG = "myLogs";
private Connect(Context context, InputStream inputStream)
{
Log.d(LOG_TAG, "Создаю скрипт");
SqlScript sqlScript = new SqlScript(inputStream);
Log.d(LOG_TAG, "Создаю DBHelper");
dbHelper = new DBHelper(context, sqlScript);
Log.d(LOG_TAG, "Подключаюсь к базе данных");
sqLiteDatabase = dbHelper.getWritableDatabase();
Log.d(LOG_TAG, "Включаю настройки PRAGMA");
sqLiteDatabase.execSQL("PRAGMA read_uncommitted = true;");
sqLiteDatabase.execSQL("PRAGMA defer_foreign_keys = true;");
sqLiteDatabase.execSQL("PRAGMA foreign_keys = true;");
reset();
}
public void stop()
{
sqLiteDatabase.close();
dbHelper.close();
Log.d(LOG_TAG, "Отключился от базы данных");
}
public static Connect start(Context context,InputStream inputStream)
{
if (instance == null)
{
instance = new Connect(context, inputStream);
}
return instance;
}
public void reset()
{
stack[0] = 0;
parentId = 0;
stackTop = 1;
}
private void push(int id)
{
if (stackTop < 9)
{
stack[stackTop] = id;
stackTop++;
}
}
private void pop()
{
stack[stackTop] = 0;
if (stackTop > 1)
stackTop--;
}
private int peek()
{
return stack[stackTop];
}
public int getParentId()
{
return parentId;
}
public String[] getGroupList(String table, String title)
{
Cursor cursor;
String[] titles = new String[] {};
String sql = "SELECT title FROM " + table +
" WHERE idParent = " + peek() +
" AND _id != 0";
if (title == null)
{
cursor = sqLiteDatabase.rawQuery(sql, null);
pop();
} else
{
// SELECT _id FROM " + table + " WHERE title = " + title + " AND idParent = " + peek();
cursor = sqLiteDatabase.query(table, new String[]{ _ID}, "title = ? AND idParent = ?",
new String[]{title, String.valueOf(peek())}, null, null, null);
if (cursor.getCount() == 0) return titles;
Log.d(LOG_TAG, String.valueOf(cursor.getInt(cursor.getColumnIndex("*"))));
parentId = cursor.getColumnIndex(cursor.getColumnName(0));
push(parentId);
cursor = sqLiteDatabase.rawQuery(sql, null);
}
int i = 0;
if (cursor.getCount() == 0) return titles;
titles = new String[cursor.getCount()];
if (cursor.moveToFirst())
{
do
{
titles[i] = cursor.getString(cursor.getColumnIndex("title"));
i++;
} while (cursor.moveToNext());
cursor.close();
}
return titles;
}
public void insertGroup(String table, String title)
{
ContentValues values = new ContentValues();
values.put("idParent", peek());
values.put("title", title);
long id = sqLiteDatabase.insert(table, null, values);
Log.d(LOG_TAG, String.valueOf("Запись добавлена (id = " + id + ")"));
}
public void deleteGroup(String table, String title)
{
long count = sqLiteDatabase.delete(table,"title = ? AND idParent = ?", new String[]{title, String.valueOf(peek())});
if (count > 1) Log.d(LOG_TAG, String.valueOf(count + " записей удалено"));
else Log.d(LOG_TAG, String.valueOf(count + " запись с title - \"" + title + "\" удалена"));
}
public void updateGroup(String table, String oldTitle, String newTitle)
{
ContentValues values = new ContentValues();
values.put("title", newTitle);
long count = sqLiteDatabase.update(table, values, "title = ? AND idParent = ?", new String[]{oldTitle, String.valueOf(peek())});
if (count > 1) Log.d(LOG_TAG, String.valueOf(count + " записей обновленно"));
else Log.d(LOG_TAG, String.valueOf("запись с title - \"" + oldTitle + "\" переименнована в \"" + newTitle +"\""));
}
}
MainActivity:
Код: Выделить всё
package com.leteam.materialgroup;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.io.IOException;
public class MainActivity extends Activity implements BaseColumns
{
final String LOG_TAG = "myLogs";
Toast toast;
AlertDialog.Builder ad;
private final int IDD = 1;
int i = 1;
ListView lvMain;
Connect connect;
String[] titles = {};
public static final int IDM_OPEN = 101;
int rez;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lvMain = (ListView) findViewById(R.id.lvMain);
registerForContextMenu(lvMain);
Log.d(LOG_TAG, "Подключаю класс Connect");
try
{
connect = Connect.start(this, getAssets().open("Create.sql"));
}
catch (IOException e)
{
e.printStackTrace();
}
onRestart();
lvMain.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
{
long timeout = System.currentTimeMillis();
Log.d(LOG_TAG, "itemClick: position = " + position + ", id = " + id + "test=" + titles[position]);
/*Здесь надо получить новые значения в name*/
titles = connect.getGroupList("S_MaterialsGroup", titles[position]);
if ((titles == null) && (connect.getParentId() != 0))
{
titles = connect.getGroupList("S_Materials", titles[position]);
}
ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(
getApplicationContext(), R.layout.item_list, titles/*ЗДЕСЬ НОВЫЙ МАСИВ ПЕРЕПРИСВАИВАЕТСЯ*/);
lvMain.setAdapter(adapter1);
timeout = System.currentTimeMillis() - timeout;
Log.d(LOG_TAG, "time=" + timeout);
}
});
lvMain.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()
{
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
rez=i;
return false;
}
});
}
protected Dialog onCreateDialog(int id) {
switch (id) {
case IDD:
final String[] mName = {"Группу", "Материал"};
ad = new AlertDialog.Builder(this);
ad.setTitle("Добавить:"); // заголовок для диалога
ad.setNeutralButton("Назад",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int id) {
dialog.cancel();
}
});
ad.setItems(mName, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
// TODO Auto-generated method stub
switch (item){
case 0:
Intent intent = new Intent(MainActivity.this, Add_Group.class);
startActivity(intent);
break;
case 1: Toast.makeText(getApplicationContext(), "Выбранный вариант: " + mName[item], Toast.LENGTH_SHORT).show();
break;
}
}
});
ad.setCancelable(false);
return ad.create();
default:
return null;
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Удалить");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// CharSequence message;
switch (item.getItemId())
{
case IDM_OPEN:
connect.deleteGroup("S_MaterialsGroup",titles[rez]);
onRestart();
// Log.d(LOG_TAG, String.valueOf(rez));
break;
// case IDM_SAVE:
// message = "Выбран пункт Сохранить";
// break;
default:
return super.onContextItemSelected(item);
}
// Toast toast = Toast.makeText(this, message, Toast.LENGTH_SHORT);
// toast.setGravity(Gravity.CENTER, 0, 0);
// toast.show();
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.action_items, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.menu_save:
toast = Toast.makeText(getApplicationContext(), "Вы нажали элемент Добавить", Toast.LENGTH_SHORT);
toast.show();
showDialog(IDD);
return true;
case R.id.menu_delete:
toast = Toast.makeText(getApplicationContext(), "Вы нажали элемент Удалить", Toast.LENGTH_SHORT);
toast.show();
return true;
default:
return false;
}
}
@Override
public void onBackPressed() {
if (i == 0)
{
super.onBackPressed();
} else
{
Log.d(LOG_TAG, "i=" + i);
i = i - 1;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
connect.stop();
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "Делаю запрос");
titles = connect.getGroupList("S_MaterialsGroup", null);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this, R.layout.item_list, titles/*ЗДЕСЬ МАССИВ ИЗ TITLE*/);
lvMain.setAdapter(adapter);
}
}
Во первых в этом коде нет строки - cursor.getInt(cursor.getColumnIndex("_id"));
Конкретно по первому сообщению, если предположить что эта строка была в коде пока вы ее не удалили и остальное осталось без изменений(во что вериться с трудом учитывая сколько вы тут накопировали а конкретно того о чем просили так и не дали...), то cursor.getString(cursor.getColumnIndex("title")); -работает потому, что у вас в SQL query title присутсвует... в данном же случае - cursor.getInt(cursor.getColumnIndex("_id")); _id в sql запросе нет и метод getColumnIndex возвращает -1. на что getInt бросает exception.
P.S. я удивлен, что на этот вопрос ответили, мало того, что нет полного кода и логи обрезанны, так вы еще и несколько раз даете не тот код о котором речь... Для начала наведите порядок и разберетесь самостоятельно. И там вместо getInt должен быть getLong...
Re: Ошибка чтения данных из БД
Добавлено: 18 июл 2014, 18:56
Foenix
Эдуард писал(а):Foenix писал(а):скрипты таблиц не вижу.
А это так важно? Человек же русским языком написал что убрав cursor.getInt() приложение начинает работать без ошибок и даже возвращает "0", но попытка взятия самих данных из этого столбца приводит к ошибке CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1 ... Именно поэтому я и спросил за Cursor, ведь выходит что объект реализующий этот интерфейс создается неявно и не разработчиком, и посмотреть код реализации cursor.getInt() невозможно.
По опыту знаю, что человек может убирать любые строки и получать черт знает что. Столбцы таблиц, названные * об этом говорят.
Да и код вцелом об этом говорит. Накопировал, начинающий, а использует всякие там PRAGMA, как видно совершенно бездумно и так далее. Если бы человек знал, как посмотреть что в курсоре или хотя бы что в базе данных у него творится - он бы тут такого вопроса не задавал, а т.к. его тут уже нету , в этой теме, видно убедился, что ошибка глупая и он ее нашел-таки.
Re: Ошибка чтения данных из БД
Добавлено: 18 июл 2014, 18:59
Foenix
altwin писал(а): _id в sql запросе нет и метод getColumnIndex возвращает -1. на что getInt бросает exception.
не в запросе нету _id скорее всего, а в таблице
Запросы он менял (код)
altwin писал(а):
P.S. я удивлен, что на этот вопрос ответили, мало того, что нет полного кода и логи обрезанны, так вы еще и несколько раз даете не тот код о котором речь... Для начала наведите порядок и разберетесь самостоятельно. И там вместо getInt должен быть getLong...
getLong - да, я такие штуки постоянно забываю

Re: Ошибка чтения данных из БД
Добавлено: 18 июл 2014, 19:00
altwin
Foenix писал(а):Эдуард писал(а):Foenix писал(а):скрипты таблиц не вижу.
А это так важно? Человек же русским языком написал что убрав cursor.getInt() приложение начинает работать без ошибок и даже возвращает "0", но попытка взятия самих данных из этого столбца приводит к ошибке CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1 ... Именно поэтому я и спросил за Cursor, ведь выходит что объект реализующий этот интерфейс создается неявно и не разработчиком, и посмотреть код реализации cursor.getInt() невозможно.
По опыту знаю, что человек может убирать любые строки и получать черт знает что. Столбцы таблиц, названные * об этом говорят.
Да и код вцелом об этом говорит. Накопировал, начинающий, а использует всякие там PRAGMA, как видно совершенно бездумно и так далее. Если бы человек знал, как посмотреть что в курсоре или хотя бы что в базе данных у него творится - он бы тут такого вопроса не задавал, а т.к. его тут уже нету , в этой теме, видно убедился, что ошибка глупая и он ее нашел-таки.
Я подозреваю, что ошибка в том, что тут:
[syntax=java5]String sql = "SELECT title FROM " + table +
" WHERE idParent = " + peek() +
" AND _id != 0"; [/syntax]
нужно было делать select (_id, title) и все... но вообще уже много раз приходится тут делать уточнение, что я не Ванга
Foenix писал(а):
не в запросе нету _id скорее всего, а в таблице
ну там в sql _id != 0, т.е. должён таки быть надеюсь

Re: Ошибка чтения данных из БД
Добавлено: 18 июл 2014, 19:04
Эдуард
altwin писал(а):Loreny писал(а):DBHelper:
Код: Выделить всё
package com.leteam.materialgroup;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class DBHelper extends SQLiteOpenHelper
{
final String LOG_TAG = "myLogs";
private SqlScript sqlScript;
public DBHelper(Context context, SqlScript sqlScript)
{
super(context, "PocketIC.db", null, 1);
this.sqlScript = sqlScript;
Log.d(LOG_TAG, "DBHelper создан");
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase)
{
Log.d(LOG_TAG, "Запускаю скрипт в методе onCreate");
sqlScript.runScript(sqLiteDatabase);
Log.d(LOG_TAG, "Скрипт завершен");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2)
{
Log.d(LOG_TAG, "Запускаю метод onCreate в методе onUpgrade");
List<String> tables = new ArrayList<String>();
Cursor cursor = sqLiteDatabase.rawQuery("SELECT * FROM sqlite_master WHERE type='table'", null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
String tableName = cursor.getString(1);
if (!tableName.equals("android_metadata") &&
!tableName.equals("sqlite_sequence"))
tables.add(tableName);
cursor.moveToNext();
}
cursor.close();
for(String tableName:tables) {
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + tableName);
}
onCreate(sqLiteDatabase);
}
}
Connect:
Код: Выделить всё
package com.leteam.materialgroup;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.provider.BaseColumns;
import android.util.Log;
import java.io.InputStream;
public class Connect implements BaseColumns
{
private static Connect instance;
private SQLiteDatabase sqLiteDatabase;
DBHelper dbHelper;
int parentId;
private int[] stack = new int[10];
private int stackTop;
final String LOG_TAG = "myLogs";
private Connect(Context context, InputStream inputStream)
{
Log.d(LOG_TAG, "Создаю скрипт");
SqlScript sqlScript = new SqlScript(inputStream);
Log.d(LOG_TAG, "Создаю DBHelper");
dbHelper = new DBHelper(context, sqlScript);
Log.d(LOG_TAG, "Подключаюсь к базе данных");
sqLiteDatabase = dbHelper.getWritableDatabase();
Log.d(LOG_TAG, "Включаю настройки PRAGMA");
sqLiteDatabase.execSQL("PRAGMA read_uncommitted = true;");
sqLiteDatabase.execSQL("PRAGMA defer_foreign_keys = true;");
sqLiteDatabase.execSQL("PRAGMA foreign_keys = true;");
reset();
}
public void stop()
{
sqLiteDatabase.close();
dbHelper.close();
Log.d(LOG_TAG, "Отключился от базы данных");
}
public static Connect start(Context context,InputStream inputStream)
{
if (instance == null)
{
instance = new Connect(context, inputStream);
}
return instance;
}
public void reset()
{
stack[0] = 0;
parentId = 0;
stackTop = 1;
}
private void push(int id)
{
if (stackTop < 9)
{
stack[stackTop] = id;
stackTop++;
}
}
private void pop()
{
stack[stackTop] = 0;
if (stackTop > 1)
stackTop--;
}
private int peek()
{
return stack[stackTop];
}
public int getParentId()
{
return parentId;
}
public String[] getGroupList(String table, String title)
{
Cursor cursor;
String[] titles = new String[] {};
String sql = "SELECT title FROM " + table +
" WHERE idParent = " + peek() +
" AND _id != 0";
if (title == null)
{
cursor = sqLiteDatabase.rawQuery(sql, null);
pop();
} else
{
// SELECT _id FROM " + table + " WHERE title = " + title + " AND idParent = " + peek();
cursor = sqLiteDatabase.query(table, new String[]{ _ID}, "title = ? AND idParent = ?",
new String[]{title, String.valueOf(peek())}, null, null, null);
if (cursor.getCount() == 0) return titles;
Log.d(LOG_TAG, String.valueOf(cursor.getInt(cursor.getColumnIndex("*"))));
parentId = cursor.getColumnIndex(cursor.getColumnName(0));
push(parentId);
cursor = sqLiteDatabase.rawQuery(sql, null);
}
int i = 0;
if (cursor.getCount() == 0) return titles;
titles = new String[cursor.getCount()];
if (cursor.moveToFirst())
{
do
{
titles[i] = cursor.getString(cursor.getColumnIndex("title"));
i++;
} while (cursor.moveToNext());
cursor.close();
}
return titles;
}
public void insertGroup(String table, String title)
{
ContentValues values = new ContentValues();
values.put("idParent", peek());
values.put("title", title);
long id = sqLiteDatabase.insert(table, null, values);
Log.d(LOG_TAG, String.valueOf("Запись добавлена (id = " + id + ")"));
}
public void deleteGroup(String table, String title)
{
long count = sqLiteDatabase.delete(table,"title = ? AND idParent = ?", new String[]{title, String.valueOf(peek())});
if (count > 1) Log.d(LOG_TAG, String.valueOf(count + " записей удалено"));
else Log.d(LOG_TAG, String.valueOf(count + " запись с title - \"" + title + "\" удалена"));
}
public void updateGroup(String table, String oldTitle, String newTitle)
{
ContentValues values = new ContentValues();
values.put("title", newTitle);
long count = sqLiteDatabase.update(table, values, "title = ? AND idParent = ?", new String[]{oldTitle, String.valueOf(peek())});
if (count > 1) Log.d(LOG_TAG, String.valueOf(count + " записей обновленно"));
else Log.d(LOG_TAG, String.valueOf("запись с title - \"" + oldTitle + "\" переименнована в \"" + newTitle +"\""));
}
}
MainActivity:
Код: Выделить всё
package com.leteam.materialgroup;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.io.IOException;
public class MainActivity extends Activity implements BaseColumns
{
final String LOG_TAG = "myLogs";
Toast toast;
AlertDialog.Builder ad;
private final int IDD = 1;
int i = 1;
ListView lvMain;
Connect connect;
String[] titles = {};
public static final int IDM_OPEN = 101;
int rez;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lvMain = (ListView) findViewById(R.id.lvMain);
registerForContextMenu(lvMain);
Log.d(LOG_TAG, "Подключаю класс Connect");
try
{
connect = Connect.start(this, getAssets().open("Create.sql"));
}
catch (IOException e)
{
e.printStackTrace();
}
onRestart();
lvMain.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
{
long timeout = System.currentTimeMillis();
Log.d(LOG_TAG, "itemClick: position = " + position + ", id = " + id + "test=" + titles[position]);
/*Здесь надо получить новые значения в name*/
titles = connect.getGroupList("S_MaterialsGroup", titles[position]);
if ((titles == null) && (connect.getParentId() != 0))
{
titles = connect.getGroupList("S_Materials", titles[position]);
}
ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(
getApplicationContext(), R.layout.item_list, titles/*ЗДЕСЬ НОВЫЙ МАСИВ ПЕРЕПРИСВАИВАЕТСЯ*/);
lvMain.setAdapter(adapter1);
timeout = System.currentTimeMillis() - timeout;
Log.d(LOG_TAG, "time=" + timeout);
}
});
lvMain.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()
{
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
rez=i;
return false;
}
});
}
protected Dialog onCreateDialog(int id) {
switch (id) {
case IDD:
final String[] mName = {"Группу", "Материал"};
ad = new AlertDialog.Builder(this);
ad.setTitle("Добавить:"); // заголовок для диалога
ad.setNeutralButton("Назад",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int id) {
dialog.cancel();
}
});
ad.setItems(mName, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
// TODO Auto-generated method stub
switch (item){
case 0:
Intent intent = new Intent(MainActivity.this, Add_Group.class);
startActivity(intent);
break;
case 1: Toast.makeText(getApplicationContext(), "Выбранный вариант: " + mName[item], Toast.LENGTH_SHORT).show();
break;
}
}
});
ad.setCancelable(false);
return ad.create();
default:
return null;
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Удалить");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// CharSequence message;
switch (item.getItemId())
{
case IDM_OPEN:
connect.deleteGroup("S_MaterialsGroup",titles[rez]);
onRestart();
// Log.d(LOG_TAG, String.valueOf(rez));
break;
// case IDM_SAVE:
// message = "Выбран пункт Сохранить";
// break;
default:
return super.onContextItemSelected(item);
}
// Toast toast = Toast.makeText(this, message, Toast.LENGTH_SHORT);
// toast.setGravity(Gravity.CENTER, 0, 0);
// toast.show();
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.action_items, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.menu_save:
toast = Toast.makeText(getApplicationContext(), "Вы нажали элемент Добавить", Toast.LENGTH_SHORT);
toast.show();
showDialog(IDD);
return true;
case R.id.menu_delete:
toast = Toast.makeText(getApplicationContext(), "Вы нажали элемент Удалить", Toast.LENGTH_SHORT);
toast.show();
return true;
default:
return false;
}
}
@Override
public void onBackPressed() {
if (i == 0)
{
super.onBackPressed();
} else
{
Log.d(LOG_TAG, "i=" + i);
i = i - 1;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
connect.stop();
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "Делаю запрос");
titles = connect.getGroupList("S_MaterialsGroup", null);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this, R.layout.item_list, titles/*ЗДЕСЬ МАССИВ ИЗ TITLE*/);
lvMain.setAdapter(adapter);
}
}
Во первых в этом коде нет строки - cursor.getInt(cursor.getColumnIndex("_id"));
Конкретно по первому сообщению, если предположить что эта строка была в коде пока вы ее не удалили и остальное осталось без изменений(во что вериться с трудом учитывая сколько вы тут накопировали а конкретно того о чем просили так и не дали...), то cursor.getString(cursor.getColumnIndex("title")); -работает потому, что у вас в SQL query title присутсвует... в данном же случае - cursor.getInt(cursor.getColumnIndex("_id")); _id в sql запросе нет и метод getColumnIndex возвращает -1. на что getInt бросает exception.
P.S. я удивлен, что на этот вопрос ответили, мало того, что нет полного кода и логи обрезанны, так вы еще и несколько раз даете не тот код о котором речь... Для начала наведите порядок и разберетесь самостоятельно. И там вместо getInt должен быть getLong...
Код: Выделить всё
// SELECT _id FROM " + table + " WHERE title = " + title + " AND idParent = " + peek();
cursor = sqLiteDatabase.query(table, new String[]{ _ID}, "title = ? AND idParent = ?",
new String[]{title, String.valueOf(peek())}, null, null, null);
if (cursor.getCount() == 0) return titles;
Log.d(LOG_TAG, String.valueOf(cursor.getInt(cursor.getColumnIndex("*"))));
parentId = cursor.getColumnIndex(cursor.getColumnName(0));
push(parentId);
cursor = sqLiteDatabase.rawQuery(sql, null);
Вот он, просто человек явно с экспериментами запарился и забыл его поправить перед вставкой сюда
Код: Выделить всё
Log.d(LOG_TAG, String.valueOf(cursor.getInt(cursor.getColumnIndex("*"))));
А должно быть
Код: Выделить всё
Log.d(LOG_TAG, String.valueOf(cursor.getInt(cursor.getColumnIndex("_id"))));
Re: Ошибка чтения данных из БД
Добавлено: 18 июл 2014, 19:12
altwin
Эдуард писал(а):
Код: Выделить всё
// SELECT _id FROM " + table + " WHERE title = " + title + " AND idParent = " + peek();
cursor = sqLiteDatabase.query(table, new String[]{ _ID}, "title = ? AND idParent = ?",
new String[]{title, String.valueOf(peek())}, null, null, null);
if (cursor.getCount() == 0) return titles;
Log.d(LOG_TAG, String.valueOf(cursor.getInt(cursor.getColumnIndex("*"))));
parentId = cursor.getColumnIndex(cursor.getColumnName(0));
push(parentId);
cursor = sqLiteDatabase.rawQuery(sql, null);
Вот он, просто человек явно с экспериментами запарился и забыл его поправить перед вставкой сюда
Код: Выделить всё
Log.d(LOG_TAG, String.valueOf(cursor.getInt(cursor.getColumnIndex("*"))));
А должно быть
Код: Выделить всё
Log.d(LOG_TAG, String.valueOf(cursor.getInt(cursor.getColumnIndex("_id"))));
Дело в том, что этот кусок кода работать не будет. И раз уж человек запарился в такой простой вещи, как копирование, как можно быть уверенным, что он еще где -то не запарился? Ошибка четко говорит о том, что метод getColumnIndex вернул -1, о чем в документации говорится, что это значит: column name does not exist. Далее ничего значения не имеет. его не существует либо в таблице, либо курсор его не получил. Варриантов других быть не может.. помочь найти - в данном случае не возможно, потому что код копируется постоянно не корректно.
И вообще я бы предпочел в данном случае использовать SQLiteCursor, с которым работать проще просто глядя на имена доступных методов, но почему то кажется, что автору просто нужно не много отойти от монитора... потом легче найти будет ошибку.