Урок 52 - разберись, там все написано же. У тебя перепутано все.
Глянул, у меня так и написано, может я что-то упускаю? Как так всё перепутано?))
Вот один из xml.
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/itemID2"
android:layout_width="39dp"
android:layout_height="wrap_content"
android:layout_marginLeft="0dp"
android:textSize="24sp" />
<TextView
android:id="@+id/itemNum2"
android:layout_width="39dp"
android:layout_height="wrap_content"
android:layout_marginLeft="0dp"
android:textSize="24sp" />
<TextView
android:id="@+id/itemTitle2"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:layout_marginLeft="0dp"
android:layout_weight="0.20"
android:textSize="24sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/itemBarscn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:layout_weight="0.53"
android:textSize="24sp" />
</LinearLayout>
</LinearLayout>
Если выскакивает ошибка, что нет такой колонки в таблице - то это так и есть. Тут нужно привести лог и код активити.
Я не сомневаюсь в том, что оно думает, но такая колонка есть!
Настораживает то, что если попробовать обращаться к колонкам первой таблицы оно это делает, хотя не должно о ней знать.
Код активити для второй таблицы (сейчас я запускаю сразу вторую талицу, поэтому там стоит открыть бд и т.д.)
Код: Выделить всё
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class Food extends Activity {
ListView lvData2;
DB db;
SimpleCursorAdapter scAdapter2;
Cursor cursor2;
public static Food m_self2;
public static int remove2 = 0;
long m_id2 = 0;
private final int IDM_ACTION = 0;
private final int IDM_EXIT = 1;
private final int IDM_REMOVE = 2;
final CharSequence[] mActions = { "Редактироать", "Удалить", "Отмена" };
public Food() {
m_self2 = this;
}
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
// открываем подключение к БД
db = new DB(this);
db.open();
// получаем курсор
refreshCursor2();
// формируем столбцы сопоставления
String[] from2 = new String[] { DB.COLUMN_ID2, DB.COLUMN_NUM2, DB.COLUMN_TITLE2,
DB.COLUMN_BARSCN2 };
int[] to2 = new int[] { R.id.itemID2, R.id.itemNum2, R.id.itemTitle2, R.id.itemBarscn2 };
// создааем адаптер и настраиваем список
scAdapter2 = new SimpleCursorAdapter(this, R.layout.item2, cursor2, from2,
to2);
lvData2 = (ListView) findViewById(R.id.lvData2);
lvData2.setAdapter(scAdapter2);
lvData2.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
m_id2 = id;
showDialog(IDM_ACTION);
}
});
}
void editDate2() {
Intent iMessage2 = new Intent(getApplicationContext(), Message2.class);
startActivity(iMessage2);
remove2 = 1;
Message2.num2 = db.getNum2(m_id2);
Message2.title2 = db.getTitle2(m_id2);
Message2.barscn2 = db.getBarscn2(m_id2);
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case IDM_ACTION:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Выберите действие");
builder.setItems(mActions, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
// редактировать
if (item == 0) {
editDate2();
}
// удалить
if (item == 1) {
showDialog(IDM_REMOVE);
}
// отмена
if (item == 2) {
dialog.cancel();
}
}
});
builder.setCancelable(false);
return builder.create();
default:
case IDM_EXIT:
AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
builder1.setMessage("Хотите выйти?");
builder1.setPositiveButton("Да",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Food.this.finish();
}
});
builder1.setNegativeButton("Нет",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
builder1.setCancelable(false);
return builder1.create();
case IDM_REMOVE:
AlertDialog.Builder builder2 = new AlertDialog.Builder(this);
builder2.setMessage("Удалить?");
builder2.setPositiveButton("Да",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
if (m_id2 != 0)
m_delRec2();
}
});
builder2.setNegativeButton("Нет",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
builder2.setCancelable(false);
return builder2.create();
}
}
// обновляем курсор
void refreshCursor2() {
stopManagingCursor(cursor2);
cursor2 = db.getAllData();
startManagingCursor(cursor2);
}
// обработка нажатия кнопки "добавить товар"
public void onButtonClick_addRec2(View view) {
Intent iMessage2 = new Intent(this, Message2.class);
startActivity(iMessage2);
}
public void addReccordToDB2(String num2, String title2, String barscn2) {
// удаляем старую запись
if (m_id2 != 0)
m_delRec2();
// добавляем запись
db.addRec2(num2, title2, barscn2);
// обновляем курсор
refreshCursor2();
// даем адаптеру новый курсор
scAdapter2.changeCursor(cursor2);
m_id2 = 0;
}
void m_delRec2() {
db.delRec2(m_id2);
// обновляем курсор
refreshCursor2();
// даем адаптеру новый курсор
scAdapter2.changeCursor(cursor2);
m_id2 = 0;
}
protected void onDestroy() {
super.onDestroy();
// закрываем подключение при выходе
db.close();
}
// @Override
// public void onBackPressed() {
// //showDialog(IDM_EXIT);
// //Intent ShopActivity = new Intent(this, ShopActivity.class);
// //startActivity(ShopActivity);
// Food.this.finish();
// }
}
ЛОГКАТ
Код: Выделить всё
06-28 15:21:18.088: E/AndroidRuntime(6239): FATAL EXCEPTION: main
06-28 15:21:18.088: E/AndroidRuntime(6239): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.shop.database/com.shop.database.Food}: java.lang.IllegalArgumentException: column '_id2' does not exist
06-28 15:21:18.088: E/AndroidRuntime(6239): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
06-28 15:21:18.088: E/AndroidRuntime(6239): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
06-28 15:21:18.088: E/AndroidRuntime(6239): at android.app.ActivityThread.access$600(ActivityThread.java:141)
06-28 15:21:18.088: E/AndroidRuntime(6239): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
06-28 15:21:18.088: E/AndroidRuntime(6239): at android.os.Handler.dispatchMessage(Handler.java:99)
06-28 15:21:18.088: E/AndroidRuntime(6239): at android.os.Looper.loop(Looper.java:137)
06-28 15:21:18.088: E/AndroidRuntime(6239): at android.app.ActivityThread.main(ActivityThread.java:5041)
06-28 15:21:18.088: E/AndroidRuntime(6239): at java.lang.reflect.Method.invokeNative(Native Method)
06-28 15:21:18.088: E/AndroidRuntime(6239): at java.lang.reflect.Method.invoke(Method.java:511)
06-28 15:21:18.088: E/AndroidRuntime(6239): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-28 15:21:18.088: E/AndroidRuntime(6239): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-28 15:21:18.088: E/AndroidRuntime(6239): at dalvik.system.NativeStart.main(Native Method)
06-28 15:21:18.088: E/AndroidRuntime(6239): Caused by: java.lang.IllegalArgumentException: column '_id2' does not exist
06-28 15:21:18.088: E/AndroidRuntime(6239): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
06-28 15:21:18.088: E/AndroidRuntime(6239): at android.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:333)
06-28 15:21:18.088: E/AndroidRuntime(6239): at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:81)
06-28 15:21:18.088: E/AndroidRuntime(6239): at com.shop.database.Food.onCreate(Food.java:55)
06-28 15:21:18.088: E/AndroidRuntime(6239): at android.app.Activity.performCreate(Activity.java:5104)
06-28 15:21:18.088: E/AndroidRuntime(6239): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
06-28 15:21:18.088: E/AndroidRuntime(6239): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
06-28 15:21:18.088: E/AndroidRuntime(6239): ... 11 more
UPD. На всякий случай код создания БД
Код: Выделить всё
package com.shop.database;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DB {
private static final String DB_NAME = "mydb400.db";
private static final int DB_VERSION = 1;
private static final String DB_TABLE = "Shop";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_TITLE = "title";
public static final String COLUMN_LATITUDE = "latitude";
public static final String COLUMN_LONGITUDE = "longitude";
public static final String COLUMN_BARSCN = "barscn";
private static final String DB_TABLE2 = "Food";
public static final String COLUMN_ID2 = "_id2";
public static final String COLUMN_NUM2 = "num2";
public static final String COLUMN_TITLE2 = "title2";
public static final String COLUMN_BARSCN2 = "barscn2";
private static final String DB_CREATE1 =
"create table " + DB_TABLE + "(" +
COLUMN_ID + " integer primary key autoincrement, " +
COLUMN_TITLE + " text, " +
COLUMN_LATITUDE + " text, " +
COLUMN_LONGITUDE + " text, " +
COLUMN_BARSCN + " text " +
");";
private static final String DB_CREATE2 =
"create table " + DB_TABLE2 + "(" +
COLUMN_ID2 + " integer primary key autoincrement, " +
COLUMN_NUM2 + " text, " +
COLUMN_TITLE2 + " text, " +
COLUMN_BARSCN2 + " text " +
");";
private final Context mCtx;
private DBHelper mDBHelper;
private SQLiteDatabase mDB;
public DB(Context ctx) {
mCtx = ctx;
}
// открыть подключение
public void open() {
mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);
mDB = mDBHelper.getWritableDatabase();
}
// закрыть подключение
public void close() {
if (mDBHelper != null)
mDBHelper.close();
}
// SHOP TABLE /////////////////////////////////////////////////////////////////////////
// получить все данные из таблицы DB_TABLE
public Cursor getAllData() {
return mDB.query(DB_TABLE, null, null, null, null, null, null);
}
// получить данные из таблицы DB_TABLE
public String getTitle(long rowIndex) {
String value = "";
Cursor c = mDB.query(DB_TABLE,
new String[] { COLUMN_ID, COLUMN_TITLE }, COLUMN_ID + "="
+ rowIndex, null, null, null, null);
int columnIndex = c.getColumnIndex(COLUMN_TITLE);
if (c.moveToNext()) {
value = c.getString(columnIndex);
}
return value;
}
public String getLatitude(long rowIndex) {
String value = "";
Cursor c = mDB.query(DB_TABLE, new String[] { COLUMN_ID,
COLUMN_LATITUDE }, COLUMN_ID + "=" + rowIndex, null, null,
null, null);
int columnIndex = c.getColumnIndex(COLUMN_LATITUDE);
if (c.moveToNext()) {
value = c.getString(columnIndex);
}
return value;
}
public String getLongitude(long rowIndex) {
String value = "";
Cursor c = mDB.query(DB_TABLE, new String[] { COLUMN_ID,
COLUMN_LONGITUDE }, COLUMN_ID + "=" + rowIndex, null, null,
null, null);
int columnIndex = c.getColumnIndex(COLUMN_LONGITUDE);
if (c.moveToNext()) {
value = c.getString(columnIndex);
}
return value;
}
public String getBarscn(long rowIndex) {
String value = "";
Cursor c = mDB.query(DB_TABLE,
new String[] { COLUMN_ID, COLUMN_BARSCN }, COLUMN_ID + "="
+ rowIndex, null, null, null, null);
int columnIndex = c.getColumnIndex(COLUMN_BARSCN);
if (c.moveToNext()) {
value = c.getString(columnIndex);
}
return value;
}
// добавить запись в DB_TABLE
public void addRec(String title, String latitude, String longitude,
String barscn) {
ContentValues cv = new ContentValues();
cv.put(COLUMN_TITLE, title);
cv.put(COLUMN_LATITUDE, latitude);
cv.put(COLUMN_LONGITUDE, longitude);
cv.put(COLUMN_BARSCN, barscn);
mDB.insert(DB_TABLE, null, cv);
}
// удалить запись из DB_TABLE
public void delRec(long id) {
mDB.delete(DB_TABLE, COLUMN_ID + " = " + id, null);
}
// SHOP TABLE END /////////////////////////////////////////////////////////////////////////
// FOOD TABLE 2/////////////////////////////////////////////////////////////////////////
// получить все данные из таблицы DB_TABLE2
public Cursor getAllData2() {
return mDB.query(DB_TABLE2, null, null, null, null, null, null);
}
// получить данные из таблицы DB_TABLE2
public String getNum2(long rowIndex) {
String value = "";
Cursor c = mDB.query(DB_TABLE2,
new String[] { COLUMN_ID2, COLUMN_NUM2 }, COLUMN_ID2 + "="
+ rowIndex, null, null, null, null);
int columnIndex = c.getColumnIndex(COLUMN_NUM2);
if (c.moveToNext()) {
value = c.getString(columnIndex);
}
return value;
}
public String getTitle2(long rowIndex) {
String value = "";
Cursor c = mDB.query(DB_TABLE2, new String[] { COLUMN_ID2,
COLUMN_TITLE2 }, COLUMN_ID2 + "=" + rowIndex, null, null, null,
null);
int columnIndex = c.getColumnIndex(COLUMN_TITLE2);
if (c.moveToNext()) {
value = c.getString(columnIndex);
}
return value;
}
public String getBarscn2(long rowIndex) {
String value = "";
Cursor c = mDB.query(DB_TABLE2, new String[] { COLUMN_ID2,
COLUMN_BARSCN2 }, COLUMN_ID2 + "=" + rowIndex, null, null,
null, null);
int columnIndex = c.getColumnIndex(COLUMN_BARSCN2);
if (c.moveToNext()) {
value = c.getString(columnIndex);
}
return value;
}
// добавить запись в DB_TABLE2
public void addRec2(String num2, String title2, String barscn2) {
ContentValues cv2 = new ContentValues();
cv2.put(COLUMN_NUM2, num2);
cv2.put(COLUMN_TITLE2, title2);
cv2.put(COLUMN_BARSCN2, barscn2);
mDB.insert(DB_TABLE2, null, cv2);
}
// удалить запись из DB_TABLE2
public void delRec2(long id) {
mDB.delete(DB_TABLE2, COLUMN_ID2 + " = " + id, null);
}
// FOOD TABLE 2 END /////////////////////////////////////////////////////////////////////////
// класс по созданию и управлению БД
private class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context, String title, CursorFactory factory,
int version) {
super(context, title, factory, version);
}
// создаем и заполняем БД
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DB_CREATE1);
db.execSQL(DB_CREATE2);
ContentValues cv1 = new ContentValues();
//for (int i = 1; i < 2; i++) {
cv1.put(COLUMN_TITLE, "Title");
cv1.put(COLUMN_LATITUDE, "LATITUDE");
cv1.put(COLUMN_LONGITUDE, "LONGITUDE");
cv1.put(COLUMN_BARSCN, "BARCODE");
db.insert(DB_TABLE, null, cv1);
//}
ContentValues cv2 = new ContentValues();
//for (int i = 1; i < 2; i++) {
cv2.put(COLUMN_NUM2, "num2");
cv2.put(COLUMN_TITLE2, "Title2");
cv2.put(COLUMN_BARSCN2, "ЗАРАБОТАЛО");
db.insert(DB_TABLE2, null, cv2);
// }
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}