2016-05-24 16 views
0

私はWIndows PCで作成したSQLiteデータベースを読み込もうとしています。 私はテーブルを読んでリストビューに表示したいだけです。 エミュレータ上のどのデータベースにもアクセスできませんか? "DIC.db"をAssetsフォルダに配置しました。テーブル名はDICです。 4つの列、1つの整数、3つのテキスト列があります。 DBite for SQLite(PC)で作成しました。 辞書を作成したいと思います。 ID、JApanese、英語とPronounciationがあります。 私にあなたの助言を与えてください。SQliteファイルを読み込めません/ Androidスタジオ2.0


public class DatabaseHelper extends SQLiteOpenHelper { 
public static final String DBNAME = "DIC.db"; 
private Context mContext; 
private SQLiteDatabase mDatabase; 

public DatabaseHelper(Context context) { 
super(context, DBNAME, null, 1); 
this.mContext = context; 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
} 

public void openDatabase() { 
    String dbPath = mContext.getDatabasePath(DBNAME).getPath(); 
    if(mDatabase != null && mDatabase.isOpen()) { 
    return; 
    } 
    mDatabase = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE);} 

public void closeDatabase() { 
    if(mDatabase!=null) {mDatabase.close();} 
} 
public List<SDic> getListWord() { 
    SDic sDic = null; 
    List<SoccerDic> wordList = new ArrayList<>(); 
    openDatabase(); 
    Cursor cursor = mDatabase.rawQuery("SELECT * FROM DIC", null); 
    cursor.moveToFirst(); 
    while (!cursor.isAfterLast()) { 
    soccerDic = new SDic(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3)); 
wordList.add(sDic); 
cursor.moveToNext(); 
    } 
cursor.close(); 
closeDatabase(); 
return wordList; 
} 

}

+0

これは主に文書化された手順です。グーグルはそれを行う方法の例がたくさんあります。 – njzk2

+0

あなたのコードが正しいと仮定すると、どこのデータベースをエミュレータに置きましたか? –

+0

これに役立つライブラリがあります。 https://github.com/jgilfelt/android-sqlite-asset-helper –

答えて

0

あなたの問題の詳細が必要です。私はあなたがデータベースを開くことができないと仮定しています。そうであれば、次の行を見て、デバッガからのパスを確認したり、Logコマンドでパスを確認したりすることができます。資産フォルダへ

String dbPath = mContext.getDatabasePath(DBNAME).getPath(); 

パスはあなたに<App Name>/assets/

回答が質問です、はい、資産フォルダ内のsqliteのDBを配置することが可能であるが、何あなたが知る必要があることは、資産フォルダは、実行時にアクセスすることがあります。したがって、アセットフォルダからスキーマを開いて、データベースを他の選択肢(例えば/data/data/<appname>/database)にコピーすることを検討することができます。

InputStream myinput = mycontext.getAssets().open(DB_NAME); 

// Path to the just created empty db 
String outfilename = Constants.DB_PATH + DB_NAME; 

File checkFolder = new File(Constants.DB_PATH); 
if(!checkFolder.exists()) { 
    checkFolder.mkdirs(); 
} 

//Open the empty db as the output stream 
OutputStream myoutput = new FileOutputStream(outfilename); 

// transfer byte to inputfile to outputfile 
byte[] buffer = new byte[1024]; 
int length; 
while ((length = myinput.read(buffer))>0) { 
    myoutput.write(buffer,0,length); 
} 

//Close the streams 
myoutput.flush(); 
myoutput.close(); 
myinput.close(); 
//Open the database 
String mypath = Constants.DB_PATH + DB_NAME; 
if(myDataBase == null) { 
    myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE); 
} 
+0

ファイルをコピーするのはあまりにも多くの作業のようです。上記のコメントのライブラリはすべて必要です。 –

+0

答えには2つの部分があります。まず、アセットフォルダからそれをそのまま開き、それを別の場所に移動するオプションがあります。一部のプロジェクトではサードパーティのライブラリを使用する柔軟性がないかもしれませんが、ライブラリは興味深いようです。 – jazaman

関連する問題