-1
我想拷贝数据库文件到资产文件夹,Toats notificated:复制成功,但是当我实现显示表信息时,“Android SQLiteException没有这样的表”错误被显示。 请帮帮我。非常感谢。Android:拷贝数据库文件到Access文件夹,SQLiteException:没有这样的表
Main: package com.example.huyvu.home_sqlite;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import model.Contact;
public class MainActivity extends AppCompatActivity {
String DATABASE_NAME = "dbContact.sqlite";
String DB_PATH_SUFFIX = "/databases/";
SQLiteDatabase database = null;
ListView lvContact;
ArrayAdapter<Contact> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
processCopy();
addControls();
hienThiToanBoSP();
}
private void hienThiToanBoSP() {
database = openOrCreateDatabase(DATABASE_NAME,MODE_PRIVATE,null);
Cursor cursor = database.rawQuery("select * from Contact",null);
adapter.clear();
while (cursor.moveToNext()){
int ma = cursor.getInt(0);
String ten = cursor.getString(1);
String phone = cursor.getString(2);
Contact contact = new Contact(ma,ten,phone);
adapter.add(contact);
}
cursor.close();
}
private void addControls() {
lvContact = (ListView) findViewById(R.id.lvContact);
adapter = new ArrayAdapter<Contact>(MainActivity.this,
android.R.layout.simple_list_item_1);
lvContact.setAdapter(adapter);
}
private void processCopy(){
try {
File dbFile = getDatabasePath(DATABASE_NAME);
if(!dbFile.exists()){
copyDatabaseFromAsset();
Toast.makeText(MainActivity.this,"Copy DB to device success",Toast.LENGTH_SHORT).show();
}
}
catch (Exception ex){
Toast.makeText(MainActivity.this,ex.toString(),Toast.LENGTH_SHORT).show();
Log.e("Error",ex.toString());
}
}
private String getDatabasePath(){
return getApplicationInfo().dataDir+DB_PATH_SUFFIX+DATABASE_NAME;
}
private void copyDatabaseFromAsset() {
try {
InputStream myInput = getAssets().open(DATABASE_NAME);
String outFileName = getDatabasePath();
File f = new File(getApplicationInfo().dataDir+DB_PATH_SUFFIX);
if(!f.exists())
f.mkdir();//create named databases folder
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length=myInput.read(buffer))>0){
myOutput.write(length);
myOutput.flush();
myOutput.close();
myInput.close();
}
}
catch (Exception ex){
Log.e("Error",ex.toString());
}
}
}
这是我的联系人类别: package model; /*
*/
public class Contact {
private int ma;
private String ten;
private String phone;
public Contact() {
}
public Contact(int ma, String ten, String phone) {
this.ma = ma;
this.ten = ten;
this.phone = phone;
}
public int getMa() {
return ma;
}
public void setMa(int ma) {
this.ma = ma;
}
public String getTen() {
return ten;
}
public void setTen(String ten) {
this.ten = ten;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String toString(){
return this.ma + "-" + this.ten + "\n" + this.phone;
}
}
感谢您的回答,但让我解释更多细节。 在我的db:dbContact.sqlite中,存在Contact表。 – vaart12345
感谢您的回答,但让我解释更多细节。 在我的db:dbContact.sqlite中,存在Contact表。 因此,我将其拷贝到资产文件夹,并使用代码将此数据库复制到我的手机。 在这一步,Toast通知:复制成功,之后执行hienThiToanBoSP();方法在设备上显示数据库,该应用程序崩溃。 我很抱歉我的英语,我是一个新手。 请让我现在正确的代码,以及在哪里添加? 感谢与问候。 – vaart12345
,因为在dbContact.sqlite中存在Contact表,所以我认为不需要CREATE TABLE。 – vaart12345