2013-01-15 96 views
0

您好我想知道如何保存數據在sqlite數據庫 以及如何比較數據從該數據庫的腰部目的, 假設我有一個註冊頁面和之後註冊時,我有一個登錄頁面,並在日誌中我要到下一個活動,我有這個人的數據在ListView 並登錄應通過數據庫來完成而已, 請幫我出無法保存在數據庫中的數據庫在Android中的sqlite

適配器類

public class DBAdapter 
{ 
public static final String KEY_ROWID = "_id"; 
public static final String KEY_NAME = "name"; 
public static final String KEY_EMAIL = "email"; 
public static final String KEY_PHONE = "phone"; 
private static final String TAG = "DBAdapter"; 
private static final String DATABASE_NAME = "MyDB"; 
private static final String DATABASE_TABLE = "contacts"; 
private static final int DATABASE_VERSION = 4; 

private static final String DATABASE_CREATE = 
"create table contacts (_id integer primary key autoincrement, " 
+ "name text not null, email text not null, phone int not null);"; 
private final Context context; 
private DatabaseHelper DBHelper; 
private 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);//SQLiteOpenHelper (Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 
    } // SQLiteDatabase.CursorFactory is null by default 

    @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 contacts"); 
    onCreate(db); 
    } 
} 

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

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

//---insert a contact into the database--- 
public long insertContact(String name, String email, String phone) 
{ 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_NAME, name); 
    initialValues.put(KEY_EMAIL, email); 
    initialValues.put(KEY_PHONE, phone); 
    return db.insert(DATABASE_TABLE, null, initialValues); // 2nd parameter - null indicates all column values. 
} 

//---deletes a particular contact--- 
public boolean deleteContact(long rowId) 
{ 
return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; // relational operator returns true/false 
} 

//---retrieves all the contacts--- 
public Cursor getAllContacts() 
{ 
    return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME,KEY_EMAIL,KEY_PHONE}, null, null, null, null, null); 
} 

//---retrieves a particular contact--- 
public Cursor getContact(long rowId) throws SQLException 
{ 
Cursor mCursor = 
db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, 
KEY_NAME, KEY_EMAIL,KEY_PHONE}, KEY_ROWID + "=" + rowId, null, 
null, null, null, null); 
if (mCursor != null) { 
mCursor.moveToFirst(); 
} 
return mCursor; 
} 

//---updates a contact--- 
public boolean updateContact(long rowId, String name, String email, String phone) 
{ 
    ContentValues args = new ContentValues(); 
    args.put(KEY_NAME, name); 
    args.put(KEY_EMAIL, email); 
    args.put(KEY_PHONE, phone); 
    return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; 
} 
} 

主要活動cl屁股

public class MainActivity extends Activity 
{ 
Button submit; 
EditText name,email,number; 
private long id; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    submit = (Button)findViewById(R.id.button1); 
    name = (EditText)findViewById(R.id.editText1); 
    email = (EditText)findViewById(R.id.editText2); 
    number = (EditText)findViewById(R.id.editText3); 

    // final String name1 = name.getText().toString(); 
    // final String email1 = email.getText().toString(); 
    // final String number1 = number.getText().toString(); 

    final DBAdapter db = new DBAdapter(this); 
    submit.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) 
     { 
      // TODO Auto-generated method stub 
      String name1 = name.getText().toString(); 
      String email1 = email.getText().toString(); 
      String number1 = number.getText().toString(); 
      db.open(); 
      id = db.insertContact(name1,email1,number1); 

      //id = db.insertContact("Suven Consultants", "courses.suvenconsultants.com","+919892544177"); 
      db.close(); 

      db.open(); 
      Cursor c = db.getContact(id); 
      if (c.moveToFirst()) 
      DisplayContact(c); 
      else 
      //Toast.makeText(this, "No contact found", Toast.LENGTH_LONG).show(); 
      db.close(); 

     } 
    }); 


} 

public void DisplayContact(Cursor c) 
{ 
Toast.makeText(this, "id: " + c.getString(0) + "\n" + 
     "Name: " + c.getString(1) + "\n" + 
     "Email: " + c.getString(2)+ "\n" + 
    "Phone: " + c.getString(3), 
       Toast.LENGTH_LONG).show(); 
} 

}

+2

你得到的錯誤是什麼? – jmathew

+0

我沒有看到問題? – njzk2

+0

int不是字符串 – njzk2

回答

0

的問題是,您要插入字符串的電話號碼到數據庫的INT場,那不可能

更改此:

私有靜態最後絃樂DATABASE_CREATE = 「創建表的聯繫人(_id整數主鍵自動遞增,」 +「名稱的文本不爲空,電子郵件正文不爲空,電話INT NOT NULL) ;「;

成這樣:

私有靜態最後絃樂DATABASE_CREATE = 「CREATE TABLE接觸 (_id整數主鍵自動遞增,」 +「名稱的文本不爲空,電子郵件正文不爲空,電話短信不空值);」;

那麼它應該工作不要在數據庫中使用int作爲電話號碼int限制爲可能導致錯誤的一些限制(例如,一個高的數字是一個int值) ,其更容易從DB後來投在應用

而且字符串不要忘記刪除舊DB模擬器/設備上你,否則做了更改後的新創建語句不是被執行的。

+0

這不是真的,從SQLite文檔中您可以讀取:SQLite版本3數據庫中的任何列(除INTEGER PRIMARY KEY列外)均可用於存儲任何存儲類的值。'更多信息:http://www.sqlite.org/datatype3.html,但這樣做的目的可能是錯誤的原因。 – sabadow

+0

這意味着每個列都會釋放主鍵,可以保存以下數據類型之一:INTEGER,REAL,TEXT或BLOB。這並不意味着您可以將定義爲字符串的數據存儲到定義爲整數的列中。 – Nickolaus

0

這聽起來像你應該這樣做的網絡服務器,可以檢查用戶是否已註冊,然後驗證信息。如果您只是讓用戶創建帳戶並將該數據存儲到手機以進行比較,則只需使用SharedPreferences即可。它比SQLite容易得多,你可以存儲一個字符串鍵值對,並輕鬆地將它讀回來進行比較。

+0

True,但SharedPreferences並不意味着要存放大量數據,因此如果您只有一個聯繫人,則可以執行此操作,但是如果你有很多這樣的設備,那麼存儲到SharedPreferences中的編程風格會很糟糕 – Nickolaus

+0

同意 - 它看起來像是用於登錄一個用戶。在這種情況下,註冊頁面可以寫入SharedPreferences並稍後回讀。就像我說的,如果重點是存儲手機上所有用戶的整個數據庫以檢查登錄,請使用Web服務器。 – Rarw

0

爲什麼你使用int數據類型來存儲電話號碼?整數數據類型有最小和最大限制。 由於電話號碼超過6位數字,可能會引起Overflow Exception 您必須使用string數據類型將電話號碼存儲在數據庫中。 試一下