2017-07-27 164 views
-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; 
} 
}  

回答

0

你从来没有创建表,你应该从异常理解认为它包含了“没有这样的表”。在代码中,你永远不会创建数据库,你只能尝试从它读取。解决方法很简单:在打开/创建数据库后添加SQL查询:

CREATE TABLE IF NOT EXISTS Contacts (Rows here) 
+0

感谢您的回答,但让我解释更多细节。 在我的db:dbContact.sqlite中,存在Contact表。 – vaart12345

+0

感谢您的回答,但让我解释更多细节。 在我的db:dbContact.sqlite中,存在Contact表。 因此,我将其拷贝到资产文件夹,并使用代码将此数据库复制到我的手机。 在这一步,Toast通知:复制成功,之后执行hienThiToanBoSP();方法在设备上显示数据库,该应用程序崩溃。 我很抱歉我的英语,我是一个新手。 请让我现在正确的代码,以及在哪里添加? 感谢与问候。 – vaart12345

+0

,因为在dbContact.sqlite中存在Contact表,所以我认为不需要CREATE TABLE。 – vaart12345