我一直在研究SQLite,特别是当它涉及登录和注册时。在这里,我设法发现,在注册时,数据将出现在表格中。但是如果我在没有首先注册的情况下登录,使用来自MySQL的数据进行验证,则数据将不会被传递并插入到表中。
这是一个非常奇怪的事情,因为我认为我研究过的代码,learn2crack和AndroidHive,已经解决了这个问题。或者我可能在这里遗漏了一些东西。
所以我想如果我要将用户的数据插入到LoginActivity的SQLite中,也许我需要将数据从MySQL传递给SQLite。如果用户已经存在于SQLite上,那么它不会插入新行但会更新它吗?我不确定这是否是解决这个问题的最佳方法,但我真的很感激任何建议。
否则,现在我无法检查SQLite上的现有用户。因为如果我这样做了:
public void syncUser(HashMap<String, String> queryValues) {
HashMap<String, String> user = new HashMap<>();
String selectUsernameQuery = "SELECT * FROM " + TABLE_LOGIN + " WHERE " + KEY_USERNAME + " = ?";
我无法弄清楚如何将“USERNAME”(来自EditText)从LoginActivity传递到我的SQLiteHelper,在那里我可以检查SQLite中的现有用户名。非常感谢你的帮助!
答案 0 :(得分:0)
如果用户已经存在于SQLite中,则不会插入 一个新的行,但更新它?
哦,我终于弄明白了。我每次登录应用程序时都会创建新的多行,因为我认为我应该让所有用户都能访问来自MySQL的数据与SQLite DB同步。在退出时我没有删除前一行。
但如果我在没有先注册的情况下登录,使用来自MySQL的数据进行验证,则不会传递数据并将其插入表中。
我在尝试将MySQL中的数据与SQLite同步时遇到了困难。但是由于简单的Volley POST方法,我终于成功实现了它。这是解决了我的问题的更新的工作代码:
StringRequest stringRequest = new StringRequest(Method.POST,
AppConfig.URL_LOGIN, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, "Login Response: " + response.toString());
hideDialog();
try {
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");
// Check for error node in json
if (!error) {
// Clear all previous data in SQLite and fetches data from MySQL through JSON;
// Then, will pass the parameters obtain from MySQL to SQLite
JSONObject userObj = jObj.getJSONObject("user");
sqLiteHandler.logoutUser(getApplicationContext());
sqLiteHandler.addUser(userObj.getString("uid"),
userObj.getString("username"),
userObj.getString("first_name"),
userObj.getString("last_name"),
userObj.getString("email"),
userObj.getString("type_of_tradesman"),
userObj.getString("picture"),
userObj.getString("user_description"),
userObj.getString("phone_number"),
userObj.getString("phone_service"),
userObj.getString("location"),
userObj.getString("lat"),
userObj.getString("lng"),
userObj.getString("created_at"));
// User successfully logged in
// Create login session
session.setLogin(true);
// Launch main activity
Intent intent = new Intent(LogInActivity.this, MainActivity.class);
startActivity(intent);
String successMsg = "Welcome to XXX, " + username + "!";
Toast.makeText(getApplicationContext(), successMsg, Toast.LENGTH_LONG).show();
} else {
// Error in login. Get the error message
String errorMsg = jObj.getString("error_msg");
Toast.makeText(getApplicationContext(),
errorMsg, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
// JSON error
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Login Error: " + error.getMessage());
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_LONG).show();
hideDialog();
}
}) {
@Override
protected Map<String, String> getParams() {
// Posting parameters to login url
Map<String, String> params = new HashMap<String, String>();
params.put("tag", "login");
params.put("username", username);
params.put("password", password);
return params;
}
};
// Adding request to request queue
AppController.getInstance().addToRequestQueue(stringRequest, tag_string_req);
addUser()方法:
/**
* Storing user details in database from the app's registration page
*/
public void addUser(String uid,
String username,
String first_name,
String last_name,
String email,
String type_of_tradesman,
String picture,
String user_description,
String phone_number,
String phone_service,
String location,
String lat,
String lng,
String created_at) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_UID, uid);
values.put(KEY_USERNAME, username);
values.put(KEY_FIRST_NAME, first_name);
values.put(KEY_LAST_NAME, last_name);
values.put(KEY_EMAIL, email);
values.put(KEY_TYPE_OF_TRADESMAN, type_of_tradesman);
values.put(KEY_PICTURE, picture);
values.put(KEY_USER_DESCRIPTION, user_description);
values.put(KEY_PHONE_NUMBER, phone_number);
values.put(KEY_PHONE_SERVICE, phone_service);
values.put(KEY_LOCATION, location);
values.put(KEY_LAT, lat);
values.put(KEY_LNG, lng);
values.put(KEY_CREATED_AT, created_at);
// Inserting Row
long id = db.insert(TABLE_LOGIN, null, values);
db.close();
Log.d(TAG, "New user inserted into SQLite row number " + id);
}