无法在Android中查询数据库

时间:2018-03-16 04:24:36

标签: android android-sqlite android-cursor android-contentresolver android-database

我正在尝试制作购物应用的购物车,我首先查询购物车元素,并从购物车的ID中,列表元素通过查询包含产品信息的另一个表找到与产品相关的相应元数据。我可以在显示“菜单”时成功查询产品列表,并尝试将相同的代码应用到购物车。然而它告诉我列“_id”不存在。我已经坚持了一段时间。

You can find the entire project on GitHub

以下是相关文件的重要部分

YourCart.java

{
    "tfvc.location": "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\IDE\\tf.exe",
    "team.remoteUrl": "http://server:8080/tfs/collection",
    "team.teamProject": "TeamProjectName",
    "tfvc.restrictWorkspace": true,
    "window.zoomLevel": 2 
}

我很确定在创建表时会创建列,这可以从数据库助手的摘录中看到

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_your_cart);

    ContentValues values = new ContentValues();

    values.put(CartContract.CartEntry._ID, 2);
    values.put(CartContract.CartEntry.COLUMN_NAME_ORDERED_QUANTITY, 37);

    getContentResolver().insert(CartContract.CartEntry.CONTENT_URI, values);

    String[] projection = {

            CartContract.CartEntry._ID,
            CartContract.CartEntry.COLUMN_NAME_ORDERED_QUANTITY

    };

    //gets the entire cart
    cart = getContentResolver().query(CartContract.CartEntry.CONTENT_URI, projection, null, null, null);

    ListView cartList = findViewById(R.id.CartListView);
    cartList.setAdapter(new cartAdapter(YourCart.this, cart));

}

// Following is part of cartAdapter
@Override
    public void bindView(View view, Context context, Cursor cart) {


        prodName = view.findViewById(R.id.cartListElementProductNameTextView);
        prodPrice = view.findViewById(R.id.cartListElementProductPriceTextView);

        //Projection is just the name of the columns we would like to receive
        String[] projection = {

                ProductListContract.ProductEntry.COLUMN_NAME_PRODUCT_THUMBNAIL,
                ProductListContract.ProductEntry.COLUMN_NAME_PRODUCT_NAME,
                ProductListContract.ProductEntry.COLUMN_NAME_PRODUCT_PRICE

        };

        Integer ui = cart.getInt(cart.getColumnIndexOrThrow(CartContract.CartEntry._ID));

        String[] hoho = {ui.toString()};

        Cursor productCursor = getContentResolver().query(ProductListContract.ProductEntry.CONTENT_URI, projection, ProductListContract.ProductEntry._ID, hoho, null);

        prodName.setText(productCursor.getInt(productCursor.getColumnIndexOrThrow(ProductListContract.ProductEntry.COLUMN_NAME_PRODUCT_NAME)));

        ui = productCursor.getInt(productCursor.getColumnIndexOrThrow(ProductListContract.ProductEntry.COLUMN_NAME_PRODUCT_PRICE));
        prodPrice.setText(ui.toString());

        productCursor.close();

    }

最后,这是崩溃的日志。一旦启动YourCart活动,应用程序就会崩溃

 public static final String SQL_CREATE_ENTRIES =
        "CREATE TABLE " + TABLE_NAME + " ( " +
                _ID + " INTEGER NON NULL, " +
                COLUMN_NAME_ORDERED_QUANTITY + " INTEGER)";

2 个答案:

答案 0 :(得分:0)

尝试用此替换你的create SQL_CREATE_ENTRIES语句,

 public static final String SQL_CREATE_ENTRIES =
    "CREATE TABLE " + TABLE_NAME + " ( " +
            _ID + " INTEGER NOT NULL, " +
            COLUMN_NAME_ORDERED_QUANTITY + " INTEGER)";

您的查询在_ID列中包含无效的关键字“NON”。

答案 1 :(得分:0)

由于某种原因,该表格不包含名为 _id 的列。但是,它不是因为SQL,即使SQL可能没有按照您的意愿执行。

更具体地说,使用INTEGER NON(而不是NOT)NULL而不是添加NOT NULL约束,它将为列提供INTEGER NON的column_type,它将等同于它包含 INT ,属于INTEGER的列类型(亲和力)。

作为一个例子(这利用logDatabaseInfo to be found here)与SQL一起使用: -

CREATE TABLE cart (_ID INTEGER NON NULL, quantity INTEGER)

显示: -

D/SQLITE_CSU: DatabaseList Row 1 Name=main File=/data/data/soupd.so49313202updatefailed/databases/mydb
D/SQLITE_CSU: Database Version = 1
D/SQLITE_CSU: Table Name = android_metadata Created Using = CREATE TABLE android_metadata (locale TEXT)
D/SQLITE_CSU: Table = android_metadata ColumnName = locale ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
D/SQLITE_CSU: Table Name = cart Created Using = CREATE TABLE cart (_ID INTEGER NON NULL, quantity INTEGER)
D/SQLITE_CSU: Table = cart ColumnName = _ID ColumnType = INTEGER NON Default Value = null PRIMARY KEY SEQUENCE = 0
D/SQLITE_CSU: Table = cart ColumnName = quantity ColumnType = INTEGER Default Value = null PRIMARY KEY SEQUENCE = 0

表=购物车ColumnName = _ID ColumnType = INTEGER NON默认值= null 是相关信息。

SQL可能应该是: -

<强> CREATE TABLE cart (_ID INTEGER NOT NULL, quantity INTEGER)

  
      
  • 注意通常_id / _ID用于包含由SQLite自动生成的唯一标识符的列,因此   通常你会为列提供_ID INTEGER PRIMARY KEY   定义。对此进行编码并且不为 _id 提供值   导致SQLite生成唯一标识符(通常是   1,2,3,4 .....)。
  •   
  • 注意我没有在下面的SQL中显示这个,因为你需要查看没有id的插入。
  •   

可能真实的问题

真正的问题出在其他地方,但很可能是由于没有调用DatabaseHelper的 onCreate 方法。它可能在数据库存在时被调用一次。因此,最可能的问题是表结构已更改,但数据库尚未删除。

更具体地说,onCreate方法仅在创建数据库时(自动)调用。

可能的修复

可能的解决方法是删除数据库,然后重新运行App。   - 您可以通过删除应用程序的数据来删除数据库   - 或卸载应用程序。   - 我建议如上所示更改SQL。