Java 登录活动的Android sqlite错误

Java 登录活动的Android sqlite错误,java,android,sqlite,android-sqlite,Java,Android,Sqlite,Android Sqlite,当用户登录时,应用程序似乎会崩溃然后工作。LogCat上出现一个错误,说明: Caused by: android.database.sqlite.SQLiteException: no such column: cliff (code 1): , while compiling: SELECT DISTINCT _id, name, password FROM Users WHERE name=cliff 为什么它会抛出一个错误,然后又起作用?有人能看到我的问题吗。下面是我的代码 publ

当用户登录时,应用程序似乎会崩溃然后工作。LogCat上出现一个错误,说明:

Caused by: android.database.sqlite.SQLiteException: no such column: cliff (code 1): , while compiling: SELECT DISTINCT _id, name, password FROM Users WHERE name=cliff
为什么它会抛出一个错误,然后又起作用?有人能看到我的问题吗。下面是我的代码

 public class DBAdapter {
static final String KEY_ROWID = "_id";
static final String KEY_USERNAME = "name";
static final String KEY_PASSWORD = "password";
static final String KEY_CARDNUM = "cardnum";
static final String KEY_CARDNAME = "cardname";
static final String TAG = "DBAdapter";

static final String DATABASE_NAME = "CPDB";
static final String DATABASE_TABLE = "Users";
static final String DATABASE_TABLEC = "Cards";
static final int DATABASE_VERSION = 1;

static final String DATABASE_CREATE =
        "create table Users (_id integer primary key autoincrement, " + "name text not null, password text not null, cardnum integer not null, cardname text not null);";


final Context context;

DatabaseHelper DBHelper;
SQLiteDatabase db;

public DBAdapter (Context ctx){
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper
{
    DatabaseHelper(Context context){
        super (context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db){
        try{
            db.execSQL(DATABASE_CREATE);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

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

    }
}

//--opens the DB--
public DBAdapter open() throws SQLException
{
    db= DBHelper.getWritableDatabase();
    return this;
}

//--close the DB--
public void close()
{
    DBHelper.close();
 } 

//--retrieves chosen user--
  public Cursor checkUser(String username) throws SQLException{
    Cursor mCursor =
            db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,       KEY_USERNAME, KEY_PASSWORD}, KEY_USERNAME + "=" + username, null, null, null, null,null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}

}
然后是登录java类

 public class login extends Activity {
Button btn1,btn2;

@Override
public void onCreate (Bundle savedInstanceState) {
    /* Called when the activity is first created*/
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    btn1 = (Button)findViewById(R.id.bttn_signup);
    btn2 = (Button)findViewById(R.id.bttn_signin);
}

 public void onClick(View view){

    if(view.getId() == R.id.bttn_signup) {
        startActivity(new Intent("com.cardpocket.cardpocket.signup"));
    }

    if(view.getId() == R.id.bttn_signin) {

     EditText email = (EditText) findViewById(R.id.tf_email);
        EditText pass = (EditText) findViewById(R.id.tf_password);

        String username = email.getText().toString();
        String password = pass.getText().toString();


        DBAdapter db = new DBAdapter(this);

        db.open();
        Cursor c = db.checkUser(username);
        //set someUsers as a list
        ArrayList<String> theUser = new ArrayList<>();


        if (c.moveToFirst()) {
            do {
                String aUser = c.getString(c.getColumnIndex("password"));
                theUser.add(aUser);


            } while (c.moveToNext());
        }

      if (theUser.contains(password)) {

          startActivity(new Intent("com.cardpocket.cardpocket.mainactivity"));

          /*
       //set the value and pass to the mainactivity
          Intent i = new Intent(this, mainactivity.class);
          i.putExtra("username", username);
          startActivity(i);}*/

      } else {
          //do something else
        Toast.makeText(this, "No contact found", Toast.LENGTH_LONG).show();
      }
    }
}
公共类登录扩展活动{
按钮btn1、btn2;
@凌驾
创建时的公共void(Bundle savedInstanceState){
/*首次创建活动时调用*/
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u登录);
btn1=(按钮)findViewById(R.id.bttn_注册);
btn2=(按钮)findViewById(R.id.bttn\u sign);
}
公共void onClick(视图){
if(view.getId()==R.id.bttn\u注册){
startActivity(新意图(“com.cardpocket.cardpocket.signup”);
}
if(view.getId()==R.id.bttn\u sign){
EditText电子邮件=(EditText)findViewById(R.id.tf_电子邮件);
EditText pass=(EditText)findViewById(R.id.tf_密码);
字符串username=email.getText().toString();
字符串密码=pass.getText().toString();
DBAdapter db=新的DBAdapter(此);
db.open();
游标c=db.checkUser(用户名);
//将某些用户设置为列表
ArrayList用户=新建ArrayList();
if(c.moveToFirst()){
做{
字符串aUser=c.getString(c.getColumnIndex(“密码”);
user.add(aUser);
}而(c.moveToNext());
}
if(user.contains(密码)){
startActivity(新意图(“com.cardpocket.cardpocket.mainactivity”);
/*
//设置值并传递给mainactivity
意图i=新意图(此,mainactivity.class);
i、 putExtra(“用户名”,用户名);
星触觉(i);}*/
}否则{
//做点别的
Toast.makeText(此“未找到联系人”,Toast.LENGTH_LONG.show();
}
}
}
提前谢谢。:)

您容易受到以下影响,并且忘记引用您的价值观:

SELECT DISTINCT _id, name, password FROM Users WHERE name='cliff'
                                                          ^-----^---

如果没有引号,
cliff
将被视为字段/表名,而字段/表名不存在。加上引号,
'cliff'
是一个字符串文字。

错误很明显:“cliff”列不存在

您必须在SQL请求中加引号

db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,       KEY_USERNAME, KEY_PASSWORD}, KEY_USERNAME + "= '" + username + "'", null, null, null, null,null);
此外,我建议您使用准备好的SQL查询,方法如下:

String selection = "KEY_USERNAME = ?";
String[] selectionArgs = { username };
String[] columns = {KEY_ROWID, KEY_USERNAME, KEY_PASSWORD};
Cursor cursor = db.query(true, DATABASE_TABLE, columns, selection, selectionArgs , null, null, null,null);
它将为您添加报价,并确保您的请求更安全


链接:

您必须使用(引号)“cliff”来代替cliff。如果没有引号,sqlite会将其标识为column,并且可能会给出一个错误,没有这样的column(cliff)