Страница 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 - да, я такие штуки постоянно забываю :oops:

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, с которым работать проще просто глядя на имена доступных методов, но почему то кажется, что автору просто нужно не много отойти от монитора... потом легче найти будет ошибку.