2017-07-27 36 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