由于语法错误,应用程序一直崩溃

问题描述 投票:-1回答:1

请帮我解决这个问题。我的应用一直因为这个问题而崩溃。我想做的是在用户登录后,在个人资料活动的文本视图中显示用户在SQLite数据库中的信息。请帮助我完成我的项目。我对android studio还是新手。

这是我的logcat中的语法错误。

android.database.sqlite.SQLiteException: near "null": syntax error (code 1 SQLITE_ERROR): , while compiling: Select * from USER_TABLE where null=?null =?null =?

这是我的数据库助手

public class DatabaseHelper extends SQLiteOpenHelper {


    public static String C_EMAIL,C_PREFERENCES,C_PASSWORD;;



    public DatabaseHelper(@Nullable Context context) {
        super(context, constants.DB_NAME, null, constants.DB_VERSION);
    }


    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL(constants.CREATE_TABLE);
    }

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

    public boolean insertInfo(String email, String preference,String password) {

        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(constants.C_EMAIL, email);
        values.put(constants.C_PREFERENCES, preference);
        values.put(constants.C_PASSWORD , password);

        long id = db.insert(constants.TABLE_NAME, null, values);
        if (id == -1) {
            return false;
        }else {
            return true;
        }
    }

    public boolean userExists (String email){
        String [] columns = {C_EMAIL};
        SQLiteDatabase db = getReadableDatabase();
        String selection = C_EMAIL + "=?";
        String selectionArgs []= { email };
        Cursor cursor = db.query(TABLE_NAME,columns,selection,selectionArgs,null,null,null);
        int count = cursor.getCount();
        cursor.close();
        db.close();
        if (count > 0)
            return true;
        else
            return false;
    }

  public Cursor getData(String email, String Password){
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor res = db.rawQuery(" Select * from "+ TABLE_NAME + " where "+ C_EMAIL + "=?" + C_PASSWORD + " =?", new String[]{email,Password});
        return res;
    }
}

这是我的login.java

loginacc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Cursor rs = dbHelper.getData(loginemail.getText().toString(),loginpassword.getText().toString());
                if(rs.moveToFirst()){
                    String email = rs.getString(rs.getColumnIndex(DatabaseHelper.C_EMAIL));
                    String preference = rs.getString(rs.getColumnIndex(DatabaseHelper.C_PREFERENCES));
                    String password = rs.getString(rs.getColumnIndex(DatabaseHelper.C_PASSWORD));


                    Toast.makeText(login.this,"Login Successful", Toast.LENGTH_SHORT).show();

                    Intent intent = new Intent(login.this,profile.class);
                    intent.putExtra("email", email);
                    intent.putExtra("preference", preference);
                    intent.putExtra("password", password);
                    startActivity(intent);

                    if(rs != null && rs.isClosed()){
                        rs.close();
                    }
                }
                else{
                    Toast.makeText(login.this,"Invalid Login", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

这是我的个人资料.java

public class profile extends AppCompatActivity {
    DatabaseHelper dbHelper;
    TextView pemail,ppreferences, ppassword;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile);
        dbHelper = new DatabaseHelper(this);

        pemail = findViewById(R.id.pemail);

        ppreferences = findViewById(R.id.ppreferences);
        ppassword = findViewById(R.id.ppassword);


        pemail.setText(getIntent().getStringExtra("email"));
        ppreferences.setText(getIntent().getStringExtra("preferences"));
        ppassword.setText((getIntent().getStringExtra("password")));

谢谢您的帮助!

java android database sqlite syntax
1个回答
1
投票

你在这里声明了3个静态变量。

public static String C_EMAIL,C_PREFERENCES,C_PASSWORD;

没有给它们分配任何值 所以它们都是... null. 当你在里面使用它们时 getData():

" Select * from "+ TABLE_NAME + " where "+ C_EMAIL + "=?" + C_PASSWORD + " =?"

结果是:

Select * from USER_TABLE where null=?null =?null =?

(从你的代码中看不清楚3D的位置) null =? 来自)你想要的是(我想)用这些变量来表示表的列名。所以将声明改为。

public static String C_EMAIL = "email"; // change to the actual column name
public static String C_PASSWORD = "password"; // change to the actual column name
public static String C_PREFERENCES = "preferences"; // change to the actual column name

同时加入 AND 操作符在 sql 语句中。

"Select * from "+ TABLE_NAME + " where "+ C_EMAIL + "= ? AND " + C_PASSWORD + " = ?"

编辑 在方法里面 insertInfo() 你用 constants.C_EMAIL, constants.C_PREFERENCESconstants.C_PASSWORD 似乎是你的列名。如果是这样,那么在sql语句中也使用它们,并删除静态变量。

"Select * from "+ TABLE_NAME + " where "+ constants.C_EMAIL + "= ? AND " + constants.C_PASSWORD + " = ?"
© www.soinside.com 2019 - 2024. All rights reserved.