【问题标题】:Unable to get values from SQLite database using Android Studio 2.1无法使用 Android Studio 2.1 从 SQLite 数据库中获取值
【发布时间】:2016-06-29 03:17:05
【问题描述】:

我正在尝试使用 SQLite 建立一个数据库来存储用户名和密码,但是每当我在模拟器上注册一个帐户时,它就会出错。另外,如果我只是尝试登录而不注册它会出错。这只是我的第二个帖子,如果有什么我可以在发帖时做得更好的,请告诉我!

public class DbHelper extends SQLiteOpenHelper {
private static String DbName = "SimpleDatabase";
private static int DbVersion = 1;

//Table Names
private static final String TABLE_USER = "User";

//Column Names
private static final String USER_NAME = "UserName";
private static final String PASSWORD = "Password";

//Create statements
// Todo table create statement
private static final String CREATE_TABLE_USER = "CREATE TABLE " 
        + TABLE_USER + "(" + USER_NAME + "TEXT PRIMARY KEY," 
        + PASSWORD + "TEXT)" ;

public DbHelper(Context context) {
    super(context, DbName, null, DbVersion);
}


@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE_USER);
}

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

public Boolean InsertUser(String userName,String password){
    SQLiteDatabase db = this.getWritableDatabase();

    String query = "SELECT * FROM "+TABLE_USER+" WHERE "+USER_NAME+" == '"+userName+"';";
    Cursor c = db.rawQuery(query,null);
    if(c != null && c.moveToFirst()) {
        c.close();
        return false ;

    }else{
        ContentValues values = new ContentValues();
        values.put(USER_NAME, userName);
        values.put(PASSWORD, password);

        db.insert(TABLE_USER, null, values);
        return true;
    }
}

public Boolean loginUser(String userName,String password){

    SQLiteDatabase db = this.getWritableDatabase();
    String query = "SELECT * FROM "+TABLE_USER+" WHERE "+USER_NAME+" == '"+userName+"' AND "+PASSWORD+" == '"+password+"';";
    Cursor c = db.rawQuery(query,null);
    if(c != null && c.moveToFirst()) {
        c.close();
        return true;
    }
    return false;
}

}

这是 DbHelper 附带的 LOGIN 类

public class Login extends Fragment {

TextInputLayout usernamelayout, passwordLayout;
EditText userName,password;
Button login, goToRegister;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.content_login,container,false);
}

@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    usernamelayout = (TextInputLayout)view.findViewById(R.id.user_name_layout);
    passwordLayout = (TextInputLayout)view.findViewById(R.id.password_layout);
    userName = (EditText)view.findViewById(R.id.user_name);
    password = (EditText)view.findViewById(R.id.password);
    login = (Button)view.findViewById(R.id.login_button);
    login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String userText = userName.getText().toString().trim();
            String passwordText = password.getText().toString().trim();
            if (userText.isEmpty()) {
                usernamelayout.setErrorEnabled(true);
                usernamelayout.setError("Please Enter User Name");

            } else if (passwordText.isEmpty()) {
                passwordLayout.setErrorEnabled(true);
                passwordLayout.setError("Please Enter Password");
            } else {
                DbHelper helper = new DbHelper(getActivity());
                if (helper.loginUser(userText, passwordText)) {
                    startActivity(new Intent(getActivity(), MainActivity.class));
                } else {
                    Toast.makeText(getActivity(), "User Name or Password is incorrect", Toast.LENGTH_SHORT).show();
                }
            }
        }
    });
    goToRegister = (Button)view.findViewById(R.id.go_to_register_button);
    goToRegister.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Register fragment = new Register();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
                setSharedElementReturnTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.change_image_trans));
                setExitTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.fade) );
                fragment.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.change_image_trans));
                fragment.setEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.fade));

            }

            FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
            transaction.addSharedElement(view.findViewById(R.id.logo),"LOGO");
            transaction.replace(R.id.main_container, fragment);
            transaction.commit();
        }
    });
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    getActivity().setTitle("Uhvents Login");
}

}

这里是 REGISTER 类。

public class Register extends Fragment {

TextInputLayout usernamelayout, passwordLayout;
EditText userName,password;
Button register, goToLogin;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.content_register,container,false);
}
@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    usernamelayout = (TextInputLayout) view.findViewById(R.id.user_name_layout);
    passwordLayout = (TextInputLayout) view.findViewById(R.id.password_layout);
    userName = (EditText) view.findViewById(R.id.user_name);
    password = (EditText) view.findViewById(R.id.password);

    register = (Button) view.findViewById(R.id.register_button);
    register.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String userText = userName.getText().toString().trim();
            String passwordText = password.getText().toString().trim();
            if(userText.isEmpty()) {
                usernamelayout.setErrorEnabled(true);
                usernamelayout.setError("Please Enter User Name");

            }
            else if (passwordText.isEmpty()){
                passwordLayout.setErrorEnabled(true);
                passwordLayout.setError("Please Enter Password");

            }
            else {

                DbHelper helper = new DbHelper(getActivity());
                if (helper.InsertUser(userText,passwordText)){
                    Toast.makeText(getActivity(), "Registration Success", Toast.LENGTH_SHORT).show();
                    if (getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
                    {
                        goToLogin.performClick();
                    }
                }else {
                    Toast.makeText(getActivity(), "User Name already in use.",Toast.LENGTH_SHORT).show();
                }
            }
        }
    });
    goToLogin = (Button)view.findViewById(R.id.go_to_login);
    goToLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            Login fragment = new Login();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
                    setSharedElementReturnTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.change_image_trans));
                    setExitTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.fade) );
                    fragment.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.change_image_trans));
                    fragment.setEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.fade));

            }

            FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
            transaction.addSharedElement(view.findViewById(R.id.logo),"LOGO");
            transaction.replace(R.id.main_container, fragment);
            transaction.commit();
        }

});
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    getActivity().setTitle("Register for Uhvents");
}

}

然后这是我在运行上述场景时得到的错误日志。

致命异常:主进程:com.uhdapt.tutorial4,PID:4807 android.database.sqlite.SQLiteException: no such column: UserName (code 1): , while compile: SELECT * FROM User WHERE UserName == 'alex' AND Password == '1234' 在 android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法) 在 android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887) 在 android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498) 在 android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 在 android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58) 在 android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:37) 在 android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 在 android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316) 在 android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255) 在 com.uhdapt.tutorial4.database.DbHelper.loginUser(DbHelper.java:68) 在 com.uhdapt.tutorial4.fragments.Login$1.onClick(Login.java:63) 在 android.view.View.performClick(View.java:5198) 在 android.view.View$PerformClick.run(View.java:21147) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

【问题讨论】:

  • 在列名和数据类型之间添加空格,如private static final String USER_NAME = "UserName "; private static final String PASSWORD = "Password ";

标签: java android sqlite android-studio


【解决方案1】:

您需要在串联中添加空格。

这部分没有空间

" + USER_NAME + "TEXT PRIMARY KEY,"

还有这个

+ PASSWORD + "TEXT)";

所以改成

private static final String CREATE_TABLE_USER = "CREATE TABLE " 
        + TABLE_USER + "(" + USER_NAME + " TEXT PRIMARY KEY," 
        + PASSWORD + " TEXT)";

【讨论】:

    【解决方案2】:

    异常堆栈跟踪包含在 SQLite 数据库的 User 表中找不到的列名 UserName:

    android.database.sqlite.SQLiteException: no such column: UserName (code 1): , 编译时:SELECT * FROM User WHERE UserName == 'alex' AND Password == '1234'

    要解决这个问题,您的数据库助手类需要进行如下更改:

    public class DbHelper extends SQLiteOpenHelper {
    
        private static final String DbName = "SimpleDatabase";
        private static final int DbVersion = 1;
    
        // Table Names
        private static final String TABLE_USER = "User";
    
        // Column Names
        private static final String USER_NAME = "UserName";
        private static final String PASSWORD = "Password";
    
        // Create statements
        // Todo table create statement
        private static final String CREATE_TABLE_USER = "CREATE TABLE " 
                + TABLE_USER + " (" + USER_NAME + " TEXT PRIMARY KEY,"   
                // >>>>>> Note extra space above before TEXT keyword
                + PASSWORD + " TEXT)" ;
    
        public DbHelper(Context context) {
            super(context, DbName, null, DbVersion);
        }
    
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_TABLE_USER);
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXIST "+TABLE_USER);
            onCreate(db);
        }
    
        public Boolean InsertUser(String userName,String password){
            SQLiteDatabase db = this.getWritableDatabase();
    
            String query = "SELECT * FROM "+TABLE_USER+" WHERE "+USER_NAME+" == '"+userName+"';";
            Cursor c = db.rawQuery(query,null);
    
            if (c != null && c.moveToFirst()) {
                c.close();
                return false ;
            } else {
                ContentValues values = new ContentValues();
                values.put(USER_NAME, userName);
                values.put(PASSWORD, password);
    
                db.insert(TABLE_USER, null, values);
                return true;
            }
        }
    
        public Boolean loginUser(String userName,String password){
    
            SQLiteDatabase db = this.getWritableDatabase();
            String query = "SELECT * FROM " + TABLE_USER + 
            " WHERE "+USER_NAME+" ==    '"+userName+"' AND "
            + PASSWORD + " == '"+password+"';";
    
            Cursor c = db.rawQuery(query,null);
    
            if(c != null && c.moveToFirst()) {
                    c.close();
                    return true;
            }
    
            return false;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2019-10-13
      • 1970-01-01
      相关资源
      最近更新 更多