【问题标题】:Android SQLite Error inserting dataAndroid SQLite 插入数据时出错
【发布时间】:2014-09-04 17:54:49
【问题描述】:

我是 android 新手,我创建了 SQLite 数据库,当我尝试插入数据时它崩溃和 logcat:

09-04 10:44:20.671: E/SQLiteDatabase(7026): 插入错误 ITEM_ID=0 ITEM_PRICE=50 ITEM_DETAILS=餐点 0 ITEM_IMG=image0 ITEM_NAME=餐点名称 0 09-04 10:44:20.671: E/SQLiteDatabase(7026): android.database.sqlite.SQLiteException: 表项没有名为 ITEM_PRICE: 的列,编译时:插入项目(ITEM_ID、ITEM_PRICE、ITEM_DETAILS、ITEM_IMG、ITEM_NAME)值 (?,?,?,?,?) 09-04 10:44:20.671:E/SQLiteDatabase(7026):在 android.database.sqlite.SQLiteCompiledSql.native_compile(本机方法) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.database.sqlite.SQLiteCompiledSql.(SQLiteCompiledSql.java:68) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:260) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:112) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1718) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1591) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 com.starware.emenu.database.ItemsDataSource.createItem(ItemsDataSource.java:58) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 com.starware.emenu.main.Tab2.setListData(Tab2.java:82) 09-04 10:44:20.671: E/SQLiteDatabase(7026): at com.starware.emenu.main.Tab2.onCreate(Tab2.java:53) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.app.Activity.performCreate(Activity.java:4465) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1051) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.app.ActivityThread.startActivityNow(ActivityThread.java:1797) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:682) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.widget.TabHost.setCurrentTab(TabHost.java:346) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:540) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.view.View.performClick(View.java:3511) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.view.View$PerformClick.run(View.java:14105) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.os.Handler.handleCallback(Handler.java:605) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.os.Handler.dispatchMessage(Handler.java:92) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.os.Looper.loop(Looper.java:137) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 android.app.ActivityThread.main(ActivityThread.java:4424) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 java.lang.reflect.Method.invokeNative(Native Method) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 java.lang.reflect.Method.invoke(Method.java:511) 09-04 10:44:20.671: E/SQLiteDatabase(7026): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825) 09-04 10:44:20.671: E/SQLiteDatabase(7026): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:592) 09-04 10:44:20.671: E/SQLiteDatabase(7026): at dalvik.system.NativeStart.main(Native Method)

这是我的 ItemsDataSource.class

public class ItemsDataSource {

    public Context context;
    public SQLiteDatabase database;
    public ItemsDbHelper dbHelper;
    public String[] allItemColumns = { ItemsDbHelper.ITEM_ID,
            ItemsDbHelper.ITEM_NAME, ItemsDbHelper.ITEM_DETAILS, ItemsDbHelper.ITEM_IMG, ItemsDbHelper.ITEM_PRICE };


    public ItemsDataSource(Context context) {
        dbHelper = new ItemsDbHelper(context);
        this.context = context;

    }

    public void open() throws SQLException{
        dbHelper = new ItemsDbHelper(context);
        database = dbHelper.getWritableDatabase();
    }

    public synchronized void close() {
        if(database != null){
            database.close();
        dbHelper.close();
        } 

    }

    public void createItem(ListItem item) {

        System.out.print("in create car method ");
        Cursor cursor ;
        ContentValues values = new ContentValues();
        values.put("ITEM_ID", item.getItemId());
        values.put("ITEM_NAME", item.getItemName());
        values.put("ITEM_DETAILS", item.getDetails());
        values.put("ITEM_IMG", item.getImage());
        values.put("ITEM_PRICE", item.getPrice());

        ListItem newItem;

            long insertId = database.insert(
                    ItemsDbHelper.TABLE_ITEMS, null,values);
             cursor = database.query(ItemsDbHelper.TABLE_ITEMS,
                    allItemColumns, "ITEM_ID" + " = " + insertId,
                    null, null, null, null);
            cursor.moveToFirst();
            newItem = cursorToItem(cursor);
            Log.v("createItem.item_id ", newItem.getItemId()+"");
            Log.v("createItem.item_naame ", newItem.getItemName());
            Log.v("createItem.item_serail ", newItem.getDetails());
            //Log.v("createItem.item_ph ", newItem.getPrice());
            Log.v("createItem.item_dev ", newItem.getImage());
            cursor.close();
    }


    private ListItem cursorToItem(Cursor cursor) {
        ListItem item = new ListItem();
        item.setItemId(cursor.getInt(0));
        item.setItemName(cursor.getString(1));
        item.setDetails(cursor.getString(2));
        item.setImage(cursor.getString(3));
        item.setPrice(cursor.getInt(4));
        //close();
        return item;
    }

    public int deleteItem(ListItem item) {
        int itemId = item.getItemId();
        //close();
        return database.delete(ItemsDbHelper.TABLE_ITEMS, "ITEM_ID"
                + " = " + itemId, null);
    }

    public void deleteAll()
    {
        SQLiteDatabase db = dbHelper.getWritableDatabase(); // helper is object extends SQLiteOpenHelper
        db.delete(ItemsDbHelper.TABLE_ITEMS, null, null);
    }



     }

我的 ItemsDbHelper.class

 public class ItemsDbHelper extends SQLiteOpenHelper {

public static final String TABLE_ITEMS = "items";
public static final String ITEM_ID = "item_id";
public static final String ITEM_NAME = "itemName";
public static final String ITEM_DETAILS = "itemDetails";
public static final String ITEM_IMG = "itemImg";
public static final String ITEM_PRICE = "itemPrice";


static final String DATABASE_NAME = "items.db";
private static final int DATABASE_VERSION = 10 ;


// Database creation sql statement

private static final String ITEM_CREATE = "create table "
        + TABLE_ITEMS + " (" + ITEM_ID
        + " integer primary key autoincrement , "
        + ITEM_NAME + " TEXT NOT NULL   , "
        + ITEM_DETAILS + " TEXT NOT NULL, "
        + ITEM_IMG + " TEXT NOT NULL   ,  " 
        + ITEM_PRICE + " TEXT NOT NULL )";


public ItemsDbHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

@Override
public void onCreate(SQLiteDatabase database) {
    try {
        database.execSQL(ITEM_CREATE);

    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.w(ItemsDbHelper.class.getName(),
            "Upgrading database from version " + oldVersion + " to "
                    + newVersion + ", which will destroy all old data");
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_ITEMS);
    onCreate(db);
  }
  }

更新

newItem = cursorToItem(cursor);

【问题讨论】:

  • 为什么要插入自动增量列?它会自动填充该列。尝试删除:values.put("ITEM_ID", item.getItemId());

标签: android sqlite


【解决方案1】:

请检查您的方法 createItem。请检查以下代码,我认为您会弄错。

 ContentValues values = new ContentValues();
    values.put(ItemsDbHelper.ITEM_ID, item.getItemId());
    values.put(ItemsDbHelper.ITEM_NAME, item.getItemName());
    values.put(ItemsDbHelper.ITEM_DETAILS, item.getDetails());
    values.put(ItemsDbHelper.ITEM_IMG, item.getImage());
    values.put(ItemsDbHelper.ITEM_PRICE, item.getPrice());

【讨论】:

  • 尝试重新安装应用程序。
  • 我无法在 ItemsDataSource 类的 createItem 中更新您的代码。
【解决方案2】:

您的列名定义为 public static final String ITEM_PRICE = "itemPrice"; ,之后您尝试插入 values.put("ITEM_PRICE", item.getPrice());

您应该使用静态常量,而不是常量的名称:

values.put(ItemsDbHelper.ITEM_PRICE, item.getPrice());

【讨论】:

  • 您必须为所有值执行此操作
【解决方案3】:

使用这个方法:

public void createItem(ListItem item) {

    System.out.print("in create car method ");
    Cursor cursor ;
    ContentValues values = new ContentValues();
    values.put(ItemsDbHelper.ITEM_ID, item.getItemId());
    values.put(ItemsDbHelper.ITEM_NAME, item.getItemName());
    values.put(ItemsDbHelper.ITEM_DETAILS, item.getDetails());
    values.put(ItemsDbHelper.ITEM_IMG, item.getImage());
    values.put(ItemsDbHelper.ITEM_PRICE, item.getPrice());

    ListItem newItem;

        long insertId = database.insert(
                ItemsDbHelper.TABLE_ITEMS, null,values);
         cursor = database.query(ItemsDbHelper.TABLE_ITEMS,
                allItemColumns, "ITEM_ID" + " = " + insertId,
                null, null, null, null);
        cursor.moveToFirst();
        newItem = cursorToItem(cursor);
        Log.v("createItem.item_id ", newItem.getItemId()+"");
        Log.v("createItem.item_naame ", newItem.getItemName());
        Log.v("createItem.item_serail ", newItem.getDetails());
        //Log.v("createItem.item_ph ", newItem.getPrice());
        Log.v("createItem.item_dev ", newItem.getImage());
        cursor.close();
}

在你的 createItem() 方法的地方

【讨论】:

    猜你喜欢
    • 2012-03-12
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多