Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.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
Android 写入现有数据库不是插入值_Android_Database_Sqlite - Fatal编程技术网

Android 写入现有数据库不是插入值

Android 写入现有数据库不是插入值,android,database,sqlite,Android,Database,Sqlite,我按照URL设置我的应用程序,最初使用apk,我将提供一个数据库,稍后我将更新数据库表 我可以很容易地将数据库放在资产文件夹中,然后将该数据库复制到工作目录中,但每当我尝试使用 ContentValues values = new ContentValues(); values.put("id", 16); values.put("name", "satya"); values.put("state", "hello"); sampleDB.insert("list",

我按照URL设置我的应用程序,最初使用apk,我将提供一个数据库,稍后我将更新数据库表

我可以很容易地将数据库放在资产文件夹中,然后将该数据库复制到工作目录中,但每当我尝试使用

ContentValues values = new ContentValues();
values.put("id", 16);           
values.put("name", "satya");
values.put("state", "hello");
sampleDB.insert("list", null, values);
使用下面的代码在OPEN\u READWRITE模式下打开数据库

sampleDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
尝试插入时也没有例外。请让我知道


注意:现在显示SQLiteDatabase抛出SQLiteReadOnlyDatabaseException,我已经读到,我们不能更改在asset中导出的数据库TableValue。是真的吗?

你在哪里复制的?默认情况下,Android会在/data/data/[your\u package\u name]/databases文件夹中创建数据库。试着在那里复制

编辑:

尝试将其打包到SQLiteOpenHelper类,如下所示:

public类DataBaseHelper扩展了SQLiteOpenHelper{
//应用程序数据库的Android默认系统路径。
私有静态字符串DB_PATH=“/data/data/com.example.testdatabasecopy/databases/”;
私有静态字符串DB_NAME=“mydatabase.sqlite”;
私有SQLiteDatabase-myDataBase;
私有上下文;
公共数据库助手(上下文){
super(上下文,DB_名称,null,1);
if(android.os.Build.VERSION.SDK\u INT>=VERSION\u code.JELLY\u BEAN\u MR1){
DB_PATH=context.getApplicationInfo().dataDir+“/databases/”;
}否则{
DB_PATH=“/data/data/”+context.getPackageName()+”/databases/”;
}
this.mContext=上下文;
}
/**
*在系统上创建一个空数据库,并用您自己的数据库重写它。
* */
public void createDataBase()引发IOException{
布尔值dbExist=checkDataBase();
if(dbExist){
//不执行任何操作-数据库已存在
}否则{
//通过调用此方法,将在默认系统路径中创建空数据库
//所以我们可以用我们的数据库覆盖那个数据库。
这是.getReadableDatabase();
试一试{
copyDataBase();
}捕获(IOE异常){
抛出新错误(“复制数据库时出错”);
}
}
}
/**
*检查数据库是否已存在,以避免每次打开应用程序时重新复制文件。
* 
*@如果存在则返回true,如果不存在则返回false
*/
私有布尔校验数据库(){
SQLiteDatabase checkDB=null;
试一试{
字符串myPath=DB_PATH+DB_NAME;
checkDB=SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN\u READWRITE);
}捕获(例外e){
e、 printStackTrace();
//数据库还不存在。
}
if(checkDB!=null){
checkDB.close();
}
return checkDB!=null?true:false;
}
/**
*将数据库从本地资产文件夹复制到系统文件夹中刚创建的空数据库,从中可以访问和处理数据库。这是通过
*通过测试流进行传输。
* */
私有void copyDataBase()引发IOException{
//打开本地数据库作为输入流
InputStream myInput=mContext.getAssets().open(DB_NAME);
//刚创建的空数据库的路径
字符串outFileName=DB_路径+DB_名称;
//打开空数据库作为输出流
OutputStream myOutput=新文件OutputStream(outFileName);
//将字节从输入文件传输到输出文件
字节[]缓冲区=新字节[1024];
整数长度;
而((长度=myInput.read(缓冲区))>0){
写入(缓冲区,0,长度);
}
//关闭溪流
myOutput.flush();
myOutput.close();
myInput.close();
}
public void openDataBase()引发SQLException{
//打开数据库
字符串myPath=DB_PATH+DB_NAME;
myDataBase=SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN\u READWRITE);
}
@凌驾
公共同步作废关闭(){
if(myDataBase!=null)
myDataBase.close();
super.close();
}
@凌驾
public void onCreate(SQLiteDatabase db){
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
}
//添加公共助手方法以访问数据库并从中获取内容。
//您可以通过执行“returnmydatabase.query(..”)来返回游标,这样就很容易了
//为您的视图创建适配器。
}
然后:

DataBaseHelper myDbHelper=新的DataBaseHelper(这个);
myDbHelper=新的DataBaseHelper(此);
试一试{
myDbHelper.createDataBase();
}捕获(ioe异常ioe){
抛出新错误(“无法创建数据库”);
}
试一试{
myDbHelper.openDataBase();
}捕获(SQLException sqle){
抛出sqle;
}

我只在“data/data/com.example.sqliteopenhelpercheck/databases/”中复制了它。有人能告诉我如何附加到sqlite3中,以便我可以从此表的引用创建一个新表吗?