2016-07-28 76 views
0

我的应用程序中已经有一个数据库使用第三方library。该库似乎没有删除表功能。所以我想直接使用SQLiteOpenHelper API来改变它。这可能吗?在Android中手动执行sql查询

我创建了一个扩展SQLiteOpenHelper的类,并为它提供与库中使用的相同的db名称。

public class SqliteDatabaseHelper extends SQLiteOpenHelper { 

    // Database Info 
    private static final String DATABASE_NAME = "myDatabase"; 
    private static final int DATABASE_VERSION = 1; 

    private Context context; 

    public SqliteDatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     this.context = context; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     L.w("old: " + oldVersion + ", " + "new: " + newVersion); 
     if (oldVersion != newVersion) { 
      db.execSQL("DROP TABLE IF EXISTS " + "deals_latest"); 
      onCreate(db); 
      L.w("drop it like it's hot"); 
     } 
    } 
} 

我在Application类中初始化它,看它是否反映了我创建的db类。

SQLiteDatabase db = new SqliteDatabaseHelper(this).getReadableDatabase(); 
L.w("version: " + db.getVersion()); 
L.w("path: " + db.getPath()); 

SqliteDatabaseHelper helper = new SqliteDatabaseHelper(this); 
helper.onUpgrade(db, 1, 2); // this line suppose to invoke the drop table query 

当运行应用程序时,onUpgrade()方法似乎没有被调用。

请注意,我从来没有使用过本地SQLite帮手的经验,所以我不知道这里发生了什么。我的目标只是查看onUpgrade中的查询是否被执行。但该表仍然存在于数据库中。

我该如何解决这个问题?

+0

如果您将代码中的常量'DATABASE_VERSION'更改为大于1的整数,则会调用onUpgrade()。至于你的原始问题,我仍然需要一些进一步的信息。 SQLiteHelper类和库都可以访问同一个数据库,但必须注意活锁和死锁以及数据完整性。 – NitroNbg

+0

我明白了。谢谢(你的)信息。如果是这样,我不需要明确地调用UpdateUp,只需更改DATABASE_VERSION,对吗? – AimanB

+0

是的。下次你实例化SQLiteOpenHelper这个调用super(context,DATABASE_NAME,null,DATABASE_VERSION);检查设备存储上的数据库是否与正在运行的应用程序需要的数据库匹配。 – NitroNbg

回答

1

SQLiteOpenHelper类有助于管理您自己的数据库版本。

将它用于由第三方代码管理的数据库没有意义。

只需用openDatabase()直接打开数据库即可。