2

我几乎是一个新手,我想从另一个活动中更新数据库。这意味着我有第一个活动,我正在编写 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,我可以从任何地方更改条目。但似乎我错了。有人可以向我解释什么是正确的方法吗?

谢谢!

PS如果我从同一个活动进行更新,它工作得很好,但如果我从另一个活动进行更新:(

这是我的更新方法:

 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()) });
}
4

5 回答 5

1

使用此代码

对不起,我的英语不好..所以请忽略它。

**DBAadapter db = new DBAadapter(this);
        db.open();
        thou = db.getAllFamilyMembers();

        Log.v("log"," thoughts " + thou); 
        db.close();**

在这个 DBAadapter 中是哪个类当你的数据库打开关闭方法。

getAllFamilyMembers() 是 DBAadapter 类方法。

然后您使用上述代码在其他活动中获取数据。

于 2012-11-22T09:07:51.173 回答
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();
    }
}

然后,您必须分离您的 Database 类并调用它的方法。

于 2012-11-22T09:53:34.973 回答
1

您可以尝试通过更改 SQLiteDatabase db = this.getWritableDatabase(); 来解决问题 到 SQLiteDatabase db = sqLiteHelper.getWritableDatabase();

一个很好的例子可以在这里找到:http ://android-er.blogspot.ro/2011/06/edit-row-in-sqlite-database-using.html

于 2012-11-22T10:22:20.233 回答
1

您必须定义一个独立类来与 db 交互,而不是在活动中包含代码。更好的是你必须使用 ContentProvider。

于 2012-11-22T09:02:21.287 回答
1

您在扩展 SQLiteOpenHelper 时遇到了麻烦。如文档所述,它用于管理创建和更新(更新已发布的应用程序时)。请稍后为自己省去很多麻烦,并查看SQLitedatebase 和更具体的 SQLiteClosable。

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

更直接答案的相关代码在您的助手类中。但是...救自己:-)

于 2012-11-22T09:17:04.077 回答