2017-05-18 34 views
0

我在用戶在SQLite數據庫中的應用程序中註冊時存儲用戶輸入的信息,但該應用程序崩潰時出現了我提交電子郵件地址時出現的錯誤。如果這是原因,你能告訴我如何糾正它嗎?如果沒有,請告訴我正確的原因和解決方案。將電子郵件地址提交給SQLite數據庫時出錯

我的Java文件:

public class MainActivity extends AppCompatActivity { 

AutoCompleteTextView txtmobileno, txtemail, txtname,txtuname; 
EditText txtpass; 
private SQLiteDatabase sqLiteDatabase; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    constraintLayout = (ConstraintLayout)findViewById(R.id.constraintlayout); 

    txtemail = (AutoCompleteTextView) findViewById(R.id.txtemail); 
    txtmobileno = (AutoCompleteTextView) findViewById(R.id.txtmobileno); 
    txtname = (AutoCompleteTextView) findViewById(R.id.txtname); 
    txtuname = (AutoCompleteTextView)findViewById(R.id.txtuname); 
    txtpass = (EditText)findViewById(R.id.txtpass); 

    btnSignUp = (ImageButton) findViewById(R.id.btnSignUp); 
    btnClear = (ImageButton) findViewById(R.id.btnClear); 

    createDatabase(); 

    btnSignUp.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String email = txtemail.getText().toString(); 
      String mobileno = txtmobileno.getText().toString(); 
      String name = txtemail.getText().toString(); 
      if (name.trim().equals("")) 
       txtname.setError("Please enter your name"); 
      else if (email.trim().equals("")) 
       txtemail.setError("Please enter email Address"); 
      else if (!email.contains("@") || !email.contains(".")) 
       txtemail.setError("Please enter a valid email Address"); 
      else if (mobileno.trim().length() < 10) 
       txtmobileno.setError("Not a valid mobile no"); // I'm finding solution to validate mobile no 
      else { 
       insertIntoDB(); 
       Snackbar snackbar = Snackbar 
         .make(constraintLayout, "Success", Snackbar.LENGTH_LONG) 
         .setAction("HIDE", new View.OnClickListener() { 
          @Override 
          public void onClick(View view) { 
          } 
         }); 
       snackbar.show(); 
      } 
     } 
    }); 

    btnClear.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      txtemail.setText(""); 
      txtmobileno.setText(""); 
      txtname.setText(""); 
      txtname.setError(null); 
      txtemail.setError(null); 
      txtmobileno.setError(null); 
     } 
    }); 

    txtmobileno.setOnEditorActionListener(new EditText.OnEditorActionListener() { 
     @Override 
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 

      if(actionId == EditorInfo.IME_ACTION_DONE){ 
       btnSignUp.performClick(); 
       return true; 
      } 
      return false; 
     } 
    }); 
} 

private void createDatabase(){ 
    sqLiteDatabase = openOrCreateDatabase("UserDatabase", Context.MODE_PRIVATE,null); 
    //sqLiteDatabase.execSQL("IF EXISTS (SELECT * FROM USERS) DROP TABLE USERS"); 
    sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS USERS(ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, NAME VARCHAR(30)," + 
      "USERNAME VARCHAR(15), EMAIL TEXT, PASSWORD VARCHAR(15), MOBILE VARCHAR(11))"); 
} 

protected void insertIntoDB(){ 
    String name, uname, email, password, mobile; 
    name = txtname.getText().toString(); 
    uname = txtuname.getText().toString(); 
    email = txtemail.getText().toString(); 
    password = txtpass.getText().toString(); 
    mobile = txtmobileno.getText().toString(); 

    String query = "INSERT INTO USERS VALUES(" + name +"," + uname + "," + email + "," + password + "," + mobile + ");"; 

    sqLiteDatabase.execSQL(query); 
} 
} 

編輯:添加錯誤日誌

Error log

+2

是什麼讓你覺得你不應該在問題中包含錯誤日誌? – Denny

+0

請添加錯誤日誌。 –

+0

糟糕。抱歉。我截取了截圖,但忘了添加 –

回答

1

核心的錯誤是,插入查詢你是不是封閉的值要插入,加引號。您的查詢,施工後,看起來是這樣的:

insert into TABLE values([email protected]) 

當它應該是這樣的:

insert into TABLE values('[email protected]') 

的SQL語法分析程序試圖解析當前的查詢,因爲語法不正確扼流圈。

嘗試使用準備好的SQL查詢,例如:

String sql = "INSERT INTO table_name (column_1, column_2) VALUES (?, ?)"; 
SQLiteStatement statement = db.compileStatement(sql); 

int intValue = 57; 
String stringValue = "hello"; 

statement.bindLong(1, intValue); // These match to the two question marks in the sql string 
statement.bindString(2, stringValue); 

long rowId = statement.executeInsert(); 

甚至更​​好使用SQLiteOpenHelper在這裏你可以例如這樣做:

ContentValues insertValues = new ContentValues(); 
insertValues.put("EMAIL", "[email protected]"); 
db.insert("CashData", null, insertValues); 
+0

謝謝。缺少的雙引號是兩個問題之一。 –

1

嘗試通過以下功能和雙重檢查,以將數據插入到數據庫是電子郵件領域的確產生與否下面的功能就是一個例子。

public void InsertToOppoStats(ArrayList<OppoStats> bean) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues userValues = new ContentValues(); 

    for (int i = 0; i < bean.size(); i++) { 
     ---------------------------------------- 
     userValues.put("column name", "value"); 
     ---------------------------------------- 

     userValues.put("id", bean.get(i).getID(); 
     userValues.put("name", bean.get(i).getName()); 
     userValues.put("std", bean.get(i).getStd()); 
     userValues.put("city", bean.get(i).getCity()); 

    } 

    db.insert("xyz_table", null, userValues); 

} 
+0

作爲一種替代方式,我會記住這一點,謝謝:) –

+0

@Mayank:如果你想要更靈活,而不是試圖製作一個.db文件並放入到assest文件夾和訪問數據庫。這很容易,你可以修改數據結構,如簡單的我的SQL。 [github的演示鏈接](https://github.com/jakirseu/Android-Pre-Built-database) – ashish

1
String query = "INSERT INTO USERS VALUES(" + name +"," + uname + ",'" + email + "'," + password + "," + mobile + ");"; 

試試這個代碼。 在單引號之間添加''。

希望它有幫助

相關問題