【问题标题】:android.database.sqlite.SQLiteException: no such column: name (code 1 SQLITE_ERROR)android.database.sqlite.SQLiteException:没有这样的列:名称(代码 1 SQLITE_ERROR)
【发布时间】:2019-12-11 11:15:29
【问题描述】:

我目前正在调整一个 Android 应用程序,但有一个相当简单的问题我无法解决。

在“onClick”之后,我想在我的数据库中检索一个特殊数据(在这种情况下,是加密货币的名称),但是数据存在,并且名称很好,问题来自请求而不是解决方法。

原因:android.database.sqlite.SQLiteException:没有这样的列:名称(代码 1 SQLITE_ERROR):,编译时:Select * FROM COINS WHERE cryptoName = name

这是我的 sqliteDatabase.java 的源代码

package com.example.cryptoapp;

import android.content.ContentValues;
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;

public class SqliteDatabase extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 5;
    private static final String DATABASE_NAME = "cryptoBase";
    private static final String TABLE_COINS = "COINS";

    private static final String COLUMN_ID = "_id";
    private static final String COLUMN_CRYPTONAME = "cryptoName";
    private static final String COLUMN_QUANTITY = "quantity";
    private static final String COLUMN_TOTALVALUE = "totalValue";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        String  CREATE_COINS_TABLE = "CREATE    TABLE " + TABLE_COINS + "(" + COLUMN_ID + " INTEGER PRIMARY KEY," + COLUMN_CRYPTONAME + " TEXT," + COLUMN_QUANTITY + " TEXT," + COLUMN_TOTALVALUE + " TEXT" + ")";
        db.execSQL(CREATE_COINS_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_COINS);
        onCreate(db);
    }

    public ArrayList<Coins> listCoins(){
        String sql = "select * from " + TABLE_COINS;
        SQLiteDatabase db = this.getReadableDatabase();
        ArrayList<Coins> storeCoins = new ArrayList<>();
        Cursor cursor = db.rawQuery(sql, null);
        if(cursor.moveToFirst()){
            do{
                int id = Integer.parseInt(cursor.getString(0));
                String cryptoname = cursor.getString(1);
                String quantity = cursor.getString(2);
                String totalvalue = cursor.getString(3);
                storeCoins.add(new Coins(id, cryptoname, quantity, totalvalue));
            }while (cursor.moveToNext());
        }
        cursor.close();
        return storeCoins;
    }

    public void addCoins(Coins coins){
        Log.d("TESTINADD", coins.getCryptoName());
        ContentValues values = new ContentValues();
        values.put(COLUMN_CRYPTONAME, coins.getCryptoName());
        values.put(COLUMN_QUANTITY, coins.getQuantity());
        values.put(COLUMN_TOTALVALUE, coins.getTotalValue());
        SQLiteDatabase db = this.getWritableDatabase();
        db.insert(TABLE_COINS, null, values);
    }

    public void updateCoins(Coins coins){
        ContentValues values = new ContentValues();
        values.put(COLUMN_CRYPTONAME, coins.getCryptoName());
        values.put(COLUMN_QUANTITY, coins.getQuantity());
        values.put(COLUMN_TOTALVALUE, coins.getTotalValue());
        SQLiteDatabase db = this.getWritableDatabase();
        db.update(TABLE_COINS, values, COLUMN_ID    + " = ?", new String[] { String.valueOf(coins.getId())});
    }

    public Coins findCrypto(String name){
        String query = "Select * FROM " + TABLE_COINS + " WHERE " + COLUMN_CRYPTONAME + " = " + "name";
        SQLiteDatabase db = this.getWritableDatabase();
        Coins coins = null;
        Log.d("TESTquery", query);
        Cursor cursor = db.rawQuery(query,  null);
        if  (cursor.moveToFirst()){
            int id = Integer.parseInt(cursor.getString(0));
            String mName = cursor.getString(1);
            String mQuantity = cursor.getString(2);
            String mTotalValue = cursor.getString(3);
            coins = new Coins(id, mName, mQuantity, mTotalValue);
        }
        cursor.close();
        Log.d("TEST", name);
        Log.d("TEST1", coins.getCryptoName());
        return coins;
    }

    public void deleteCoins(int id){
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_COINS, COLUMN_ID    + " = ?", new String[] { String.valueOf(id)});
    }
}

提前谢谢你!

【问题讨论】:

    标签: java android database sqlite


    【解决方案1】:
    String query = "Select * FROM " + TABLE_COINS + " WHERE " + COLUMN_CRYPTONAME + " = " + "name";
    

    这里应该是:

    String query = "Select * FROM " + TABLE_COINS + " WHERE " + COLUMN_CRYPTONAME + " LIKE " + "'" + name + "'";
    

    【讨论】:

    • @SkypeDogg 答案是正确的
    【解决方案2】:

    您将 name 作为字符串而不是变量传递,因此它是硬编码的,因此您的数据库中没有名为 name 的表,因此您遇到了这个异常来解决问题,使查询像这样

    String query = "Select * FROM " + TABLE_COINS + " WHERE " + COLUMN_CRYPTONAME + " = " + name;
    

    【讨论】:

      猜你喜欢
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多