SQLite и расширяемый список на AndroidAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 SQLite и расширяемый список на Android

Сообщение Anonymous »

Я писал простой ExpandableListView с заполнением его SQLite, но застрял с ошибкой, сообщающей мне, что у меня проблема с курсором. Вот мой код
Прежде всего — DBHelper. У меня есть крошечная БД с двумя таблицами. Сначала укажите название категории, которая может иметь неограниченное количество заголовков подкатегорий.

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

public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "main";
private static final int DB_VERSION = 1;

private SQLiteDatabase db;

public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.db = this.getWritableDatabase();
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(String.format("CREATE TABLE IF NOT EXISTS Category (CategoryName CHAR(50) PRIMARY KEY);"));
db.execSQL(String.format("CREATE TABLE IF NOT EXISTS SubCategory (SubCategoryName CHAR(50) PRIMARY KEY, CategoryName CHAR(50), FOREIGN KEY (CategoryName) REFERENCES Category(CategoryName));"));
db.execSQL(String.format("INSERT OR IGNORE INTO Category(CategoryName) VALUES('Games');"));
db.execSQL(String.format("INSERT OR IGNORE INTO SubCategory(SubCategoryName, CategoryName) VALUES('Arcade','Games');"));

}

public Cursor fetchGroup() {
String query = "SELECT * FROM Category";
return db.rawQuery(query, null);
}

public Cursor fetchChildren(String cat) {
String query = "SELECT * FROM SubCategory WHERE CategoryName = '" + cat + "'";
return db.rawQuery(query, null);
}
}
MainActivity.java

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

public class MainActivity extends Activity {

SQLiteDatabase db;
DBHelper mDbh;
ExpandableListAdapter listAdapter;
ExpandableListView expListView;
List listDataHeader;
HashMap  listDataChild;
Cursor mGroupsCursor;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDbh = new DBHelper(this);
mDbh.onOpen(db);
//mDbh.onCreate(db);
expListView = (ExpandableListView) findViewById(R.id.expandableListView);
fillData();

// preparing list data
//prepareListData();

listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild);

// setting list adapter
//expListView.setAdapter(listAdapter);

// Listview on child click listener
expListView.setOnChildClickListener(new OnChildClickListener() {

@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
final String str = listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition);
Intent i = new Intent(com.example.senso.readernew.MainActivity.this,SingleListItem.class);
i.putExtra("Name", str);
startActivity(i);
return false;
}
});
}

public class ExpandableListAdapter_DB extends SimpleCursorTreeAdapter {

public ExpandableListAdapter_DB(Cursor cursor, Context context, int groupLayout,
int childLayout, String[] groupFrom, int[] groupTo, String[] childrenFrom,
int[] childrenTo) {
super(context, cursor, groupLayout, groupFrom, groupTo,
childLayout, childrenFrom, childrenTo);
}

@Override
protected Cursor getChildrenCursor(Cursor groupCursor)
{
Cursor childCursor = mDbh.fetchChildren(groupCursor.getString(groupCursor.getColumnIndex("Category")));
startManagingCursor(childCursor);
childCursor.moveToFirst();
return childCursor;
}
}

private void fillData()
{
mGroupsCursor = mDbh.fetchGroup();

startManagingCursor(mGroupsCursor);
mGroupsCursor.moveToFirst();
expListView = (ExpandableListView)this.findViewById(R.id.expandableListView);

ExpandableListAdapter_DB mAdapter = new ExpandableListAdapter_DB(mGroupsCursor,this,
R.layout.list_group,
R.layout.list_item,
new String[]{"CategoryName"},
new int[]{R.id.lblListHeader},
new String[]{"SubCategoryName"},
new int[]{R.id.lblListItem});

expListView.setAdapter(mAdapter);
}
}
И, конечно же, сама ошибка:

11-15 17:04:43.036 21404-21404/com.example.senso.readernew
E/CursorWindow: не удалось прочитать строку 0, столбец -1 из CursorWindow
, который имеет 1 ряд, 1 columns.
11-15 17:04:43.046 21404-21404/com.example.senso.readernew E/AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: main
11-15 17:04:43.046 21404-21404/com.example.senso.readernew E/AndroidRuntime: Процесс: com.example.senso.readernew, PID: 21404
11-15 17:04:43.046 21404-21404/com.example.senso.readernew E/AndroidRuntime: java.lang.RuntimeException: невозможно начать действие
ComponentInfo{com.example.senso.readernew/com.example.senso.readernew.MainActivity}:
java.lang.IllegalStateException: не удалось прочитать строку 0, столбец -1 из
CursorWindow. Прежде чем
получить доступ к данным из него, убедитесь, что курсор правильно инициализирован.
11-15 17:04:43.046 21404-21404/com.example.senso.readernew E/AndroidRuntime: Причина: java.lang.IllegalStateException:
Не удалось прочитать строку 0, столбец -1 из КурсорОкно. Прежде чем обращаться к данным из него, убедитесь, что курсор
правильно инициализирован.
11-15 17:04:43.046 21404-21404/com.example.senso.readernew E/AndroidRuntime: at
com.example.senso.readernew.MainActivity.fillData(MainActivity.java:162)
11–15 17:04:43.046 21404-21404/com.example.senso.readernew E/AndroidRuntime: at
com.example.senso.readernew.MainActivity.onCreate(MainActivity.java:46)

Заранее спасибо!
P.S. Я написал свой код, изучая один код Android ExpandableListView и базы данных SQLite.

Подробнее здесь: https://stackoverflow.com/questions/337 ... on-android
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»