Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQLiteOpenHelper在Android中连接sqlite数据库_Android_Sqlite_Android Sqlite - Fatal编程技术网

使用SQLiteOpenHelper在Android中连接sqlite数据库

使用SQLiteOpenHelper在Android中连接sqlite数据库,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,我正在创建一个引用另一个数据库中的键的数据库。基本上,我有一个导入的数据,我希望将其与将要更改的数据分开,但如果可能,我希望通过外键引用其他键。据我所知,我需要先连接数据库才能实现这一点。以下是迄今为止的相关代码: public class LogDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "log.db"; private static final

我正在创建一个引用另一个数据库中的键的数据库。基本上,我有一个导入的数据,我希望将其与将要更改的数据分开,但如果可能,我希望通过
外键
引用其他键。据我所知,我需要先连接数据库才能实现这一点。以下是迄今为止的相关代码:

public class LogDatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "log.db";
    private static final int DATABASE_VERSION = 1;
    private String namesDb;

    public LogDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        namesDb=getNamesDbPath();

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("ATTACH DATABASE ? AS names",new String[]{namesDb});
        StringBuilder query=new StringBuilder();
        query.append("CREATE TABLE log (");
    }
}
但是,这似乎不起作用,因为我得到以下错误:

11-21 17:35:58.176: E/SQLiteLog(9984): (1) statement aborts at 5: [ATTACH DATABASE ? AS names] cannot ATTACH database within transaction
11-21 17:35:58.176: D/AndroidRuntime(9984): Shutting down VM
11-21 17:35:58.176: W/dalvikvm(9984): threadid=1: thread exiting with uncaught exception (group=0x41a21700)
11-21 17:35:58.191: E/AndroidRuntime(9984): FATAL EXCEPTION: main
11-21 17:35:58.191: E/AndroidRuntime(9984): android.database.sqlite.SQLiteException: cannot ATTACH database within transaction (code 1)
11-21 17:35:58.191: E/AndroidRuntime(9984):     at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
11-21 17:35:58.191: E/AndroidRuntime(9984):     at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:734)
11-21 17:35:58.191: E/AndroidRuntime(9984):     at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
11-21 17:35:58.191: E/AndroidRuntime(9984):     at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
11-21 17:35:58.191: E/AndroidRuntime(9984):     at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)
11-21 17:35:58.191: E/AndroidRuntime(9984):     at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1603)
11-21 17:35:58.191: E/AndroidRuntime(9984):     at com.kd7uiy.hamfinder.LogDatabaseHelper.onCreate(LogDatabaseHelper.java:27)
11-21 17:35:58.191: E/AndroidRuntime(9984):     at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
11-21 17:35:58.191: E/AndroidRuntime(9984):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)

我怎样才能让它工作呢?

我找到了一种让它工作的方法,我并不特别自豪,但它确实起到了作用。如果在附加数据库时无法在事务中,请先结束事务

db.setTransactionSuccessful();
db.endTransaction();
db.execSQL("ATTACH DATABASE ? AS names",new String[]{namesDb});
db.beginTransaction();

当我想在更新数据库时附加数据库时,我遇到了同样的问题,我所做的只是在调用onUpdate()时更改了一个静态全局变量,紧接着就是这个.getReadableDatabase()或这个.getWriteableDatabase()(实际上是调用onCreate/onUpdate方法的函数)我检查全局变量的值并运行包含attach函数的整个代码。这样,您就不会在onCreate()或onUpgrade()方法内部进行附加,而是在执行它们之后进行附加


我不确定这种方法在问题中指定的情况下是否可用,但我想我会提到如果其他人也碰到这个问题,我是如何解决的

您可能需要跳过
SQLiteOpenHelper
或分叉它。在后一种情况下,您可以删除包装
onCreate()
(自己处理)的标准事务,或者让自己有机会在任何事务边界之外运行
ATTACH
。然后您能够与附加的数据库交互吗?我也在这样做,但是当我引用附加的数据库时,我得到了一个没有这样的表错误(例如:
SELECT*FROM names.mytable
。我最终拒绝了这一点,而选择了一种完全不同的管理方式。不过,我还是要回到它,我会让你知道它是否有效……它不起作用。我在“onUpgrade”上使用这段代码()“我收到此错误“无法执行此操作,因为没有当前事务”。如果我不使用“db.setTransactionSuccessful()”、“db.endTransaction()”、“db.beginTransaction()”,则此错误显示为“无法在事务中附加数据库”这个解决方案不起作用,会让人困惑。你应该取消选中它作为公认的答案。我在onUpgrade()方法中也有同样的问题,我尝试了许多解决方案,但都没有成功。请详细说明。