2017-07-27 5 views
-1

私はコピーしたdbファイルをアセットフォルダにコピーしようとしています:コピー成功ですが、表示テーブル情報を実装すると "Android SQLiteException not such table"エラー表示されました。 私を助けてください。どうもありがとうございます。Android:データベースファイルをアクセスフォルダにコピーする、SQLiteException:そのようなテーブルはありません

メイン: パッケージ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()); 
    } 
} 
} 

これは私のコンタクトクラスです: パッケージモデル。 /* */

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テーブルがあります。 私はAssetsフォルダにコピーし、コードを使用してこのデータベースを自分の電話機にコピーします。 このステップでは、Toast notificated:コピー成功、その後は、hienThiToanBoSP()を実装します。メソッドを使用してデバイスにdbを表示すると、アプリケーションがクラッシュしました。 私は英語にすみません、私は初心者です。 今すぐ適切なコードを追加して、どこに追加しますか? ありがとうございました。 – vaart12345

+0

dbContact.sqliteは既存のContactテーブルなので、CREATE TABLEは必要ないと思います。 – vaart12345

関連する問題