我几乎是一个新手,我想从另一个活动更新数据库。这意味着我有一个第一个活动,我正在编写一个DataBaseHandler(公共类MyDatabaseHandler扩展了SQLiteOpenHelper)。
然而,在第二项活动中,我正在添加一些数据:
MyDatabaseHandler db = new MyDatabaseHandler(this);
Contact peter = new Contact(1,"Peter", 27);
db.addContact(peter);
现在我想将彼得的年龄从27岁改为28岁,我想从另一项活动中做到这一点。所以,我正在写第三个活动:
MyDatabaseHandler db = new MyDatabaseHandler(this);
Contact peter = new Contact(1,"Peter", 28);
db.updateContact(peter);
但它不起作用。我想如果我给出相同的KEY_ID,在这种情况下为1,我可以从任何地方更改条目。但似乎我错了。能够 有人向我解释什么是正确的方法?
谢谢!
P.S。如果我从同一个活动进行更新,它可以正常工作,但如果我从另一个活动进行更新则不行:(
这是我的更新方法:
public int updateContact(Contact contact) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.getName());
values.put(KEY_PH_NO, contact.getAge());
return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
new String[] { String.valueOf(contact.getID()) });
}
答案 0 :(得分:1)
您必须定义一个与db交互的独立类,而不是在活动中包含代码。最好你必须使用ContentProvider。
答案 1 :(得分:1)
使用此代码
抱歉,我的英语不好......所以请加入它。
**DBAadapter db = new DBAadapter(this);
db.open();
thou = db.getAllFamilyMembers();
Log.v("log"," thoughts " + thou);
db.close();**
在这个DBAadapter中,当数据库打开close方法时是哪个类。
getAllFamilyMembers()是DBAadapter类方法。
然后使用上面的代码获取其他活动中的数据。
答案 2 :(得分:1)
您在扩展SQLiteOpenHelper方面遇到了麻烦。如文档所述,它用于管理创建和更新(更新已发布的应用程序时)。请稍后为您节省很多麻烦,并查看 SQLitedatebase和更具体的SQLiteClosable。
<强> http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html 强>
更直接的答案的相关代码在您的助手类中。但是......保存自己: - )
答案 3 :(得分:1)
你必须做这样的课:
public class Database extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "database.db";
private static final String TABLE_NAME = "Contacts";
private static final int DATABASE_VERSION = 1;
private SQLiteDatabase myDb;
public DatabaseInterventi(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
if(myDb == null || !isMyDbOpen())
myDb = getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("DatabaseHelper", "onCreate!");
// Check if table already exists
if(!isTableExists(TABLE_NAME)){
Log.i("DatabaseHelper", "Create Table in DB");
String sql = "CREATE TABLE {0} ({1} INTEGER PRIMARY KEY AUTOINCREMENT," +
" {2} TEXT NOT NULL,{3} TEXT NOT NULL, {4} INTEGER NOT NULL);";
db.execSQL(MessageFormat.format(sql, InfoDBIntervento.TABLE_NAME, "id","Name","Surname","Tel"));
}
public void insertContact(String name, String surname, int tel){
if(!myDb.isOpen())
openDB();
ContentValues cv = new ContentValues();
cv.put("Name", name);
cv.put("Surname", surname);
cv.put("Tel", tel);
myDb.insert(TABLE_NAME, null, cv);
myDb.close();
}
public void updateContact(String name, String surname, int tel){
if(!myDb.isOpen)
openDB();
ContentValues cv = new ContentValues();
if(name != null)
cv.put("Name", name);
if(surname != null)
cv.put("Surname", surname);
if(tel != null)
cv.put("Tel", tel);
myDb.update(TABLE_NAME, cv, null, null);
myDb.close();
}
public boolean isTableExists(String tableName) {
if(!myDb.isOpen())
openDB();
Cursor cursor = myDb.rawQuery("select DISTINCT tbl_name from sqlite_master where tbl_name = '"+tableName+"'", null);
if(cursor!=null) {
if(cursor.getCount()>0) {
cursor.close();
return true;
}
}
cursor.close();
return false;
}
public void openDB(){
myDb = getWritableDatabase();
}
}
然后,您必须对数据库类进行istanziate并调用其方法。
答案 4 :(得分:1)
您可以尝试通过更改SQLiteDatabase来解决问题db = this.getWritableDatabase();到SQLiteDatabase db = sqLiteHelper.getWritableDatabase();
这里可以找到一个很好的例子:http://android-er.blogspot.ro/2011/06/edit-row-in-sqlite-database-using.html