2013-01-15 88 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数据类型将电话号码存储在数据库中。 试一下