あなたが問題を抱えているので、以下はコードと一緒に急いでまとめられたチュートリアルです。
-
SQLiteツールでデータベースとテーブルを作成し、必要に応じてデータを追加してから保存します。
-
データベースを閉じて再度開き、テーブルとデータが期待どおりであることを確認します。変更を加えない場合は、保存されたデータベースが一致することを確認するまで2を繰り返します。
-
保存したデータベースのファイル名を取得し、ファイル拡張子を含めて記録します。
-
アプリのプロジェクトをまだ作成していない場合は、作成してプロジェクトを保存します。
-
IDEの外部で、プロジェクトのapp / src / mainフォルダーに移動し、アセットという名前のフォルダーを作成します。 まだ存在しない場合。
-
データベースファイルをアセットフォルダにコピーします。
-
AndroidStudioでプロジェクトを開きます。
-
DatabaseHelperという名前の新しいJavaクラスを作成します SuperClassをSQLiteOpenHelperとして使用 (
android.database.sqlite.SQLiteOpenHelper
に解決されます )、 Select Overridesにチェックマークを付けます ダイアログチェックボックス。 [OK]をクリックします。
次のようになります:-
public class DatabaseHelper extends SQLiteOpenHelper {
public Databasehelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
-
public class DatabaseHelper extends SQLiteOpenHelper {
の後に、クラス変数として行を追加します それは次のようなものです:-public static final String DBNAME = "my_dic.db";
- 引用符内の値がアセットフォルダにコピーされたファイル名とまったく同じであることが重要であることに注意してください。
。
- 次のクラス変数を追加します
:-
public static final int DBVERSION = 1;
public static final String TB_BOOKMARK = "Bookmark";
public static final String COL_BOOKMARK_KEY = "key";
public static final String COL_BOOKMARK_VALUE = "value";
public static final String COL_BOOKMARK_DATE = "date";
SQLiteDatabase mDB;
- 引用符で囲まれた値は、TB_BOOKMARK、COL_BOOKMARK_KEY、COL_BOOKMARK_VALUE、およびCOl_BOOKMARK_DATEのデータベースで定義されたrespeticeテーブル/列名と一致する必要があることに注意してください。
- DBVERSIONは、データベースのuser_versionフィールドに格納されているバージョン番号になります。
- SQliteDatabase mDBは、SQLiteDatabaseが開かれたときにそれを保持する変数の宣言です。注現在、値は設定されるまでnullです。
。
-
Databasehelperクラスのコンストラクターを:-
から変更します。public DatabaseHelper(Context context、String name、SQLiteDatabase.CursorFactory factory、int version){super(context、name、factory、version);}
to:-
public DatabaseHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
}
- これにより、Databasehelperクラスのインスタンスを、コンテキストという1つのパラメーターのみで作成できるようになります。他の値は定義されているか、ファクトリの場合は何も使用されないため、nullはこれを意味します。
。
- メソッドを追加します。
ifDBExists
DatabaseHelperクラスに移動して、データベースが存在するかどうかを確認します(アセットファイルからデータベースをコピーするのは1回だけです)
:-
private boolean ifDBExists(Context context) {
String dbparent = context.getDatabasePath(DBNAME).getParent();
File f = context.getDatabasePath(DBNAME);
if (!f.exists()) {
Log.d("NODB MKDIRS","Database file not found, making directories."); //<<<< remove before the App goes live.
File d = new File(dbparent);
d.mkdirs();
//return false;
}
return f.exists();
}
- データベースファイルが存在することを確認することに加えて(有効なデータベースファイルであると見なされることに注意してください)、
- さらに、データベースが存在しない場合は、データベースディレクトリが存在しない可能性があります。データベースが存在しない場合は、データベースディレクトリが作成されます。
。
- 別のメソッドを追加する
copyDBFromAssets
アセットファイルをデータベースにコピーするには
:-
private boolean copyDBFromAssets(Context context) {
Log.d("CPYDBINFO","Starting attemtpt to cop database from the assets file.");
String DBPATH = context.getDatabasePath(DBNAME).getPath();
InputStream is;
OutputStream os;
int length = 8192;
long bytes_read = 0;
long bytes_written = 0;
byte[] buffer = new byte[length];
try {
is = context.getAssets().open(DBNAME);
} catch (IOException e) {
Log.e("CPYDB FAIL - NO ASSET","Failed to open the Asset file " + DBNAME);
e.printStackTrace();
return false;
}
try {
os = new FileOutputStream(DBPATH);
} catch (IOException e) {
Log.e("CPYDB FAIL - OPENDB","Failed to open the Database File at " + DBPATH);
e.printStackTrace();
return false;
}
Log.d("CPYDBINFO","Initiating copy from asset file" + DBNAME + " to " + DBPATH);
while (length >= 8192) {
try {
length = is.read(buffer,0,length);
} catch (IOException e) {
Log.e("CPYDB FAIL - RD ASSET",
"Failed while reading in data from the Asset. " +
String.valueOf(bytes_read) +
" bytes read ssuccessfully."
);
e.printStackTrace();
return false;
}
bytes_read = bytes_read + length;
try {
os.write(buffer,0,length);
} catch (IOException e) {
Log.e("CPYDB FAIL - WR ASSET","failed while writing Database File " +
DBPATH +
". " +
String.valueOf(bytes_written) +
" bytes written successfully.");
e.printStackTrace();
return false;
}
bytes_written = bytes_written + length;
}
Log.d("CPYDBINFO",
"Read " + String.valueOf(bytes_read) + " bytes. " +
"Wrote " + String.valueOf(bytes_written) + " bytes."
);
try {
os.flush();
is.close();
os.close();
} catch (IOException e ) {
Log.e("CPYDB FAIL - FINALISING","Failed Finalising Database Copy. " +
String.valueOf(bytes_read) +
" bytes read." +
String.valueOf(bytes_written) +
" bytes written."
);
e.printStackTrace();
return false;
}
return true;
}
- これは意図的に長蛇の列になっているため、障害を特定できることに注意してください。
完全なDatabaseHelperクラスは次のようになります:-
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DBNAME = "my_dic.db"; // <<<< VERY IMPORTANT THAT THIS MATCHES DATABASE FILE NAME
public static final int DBVERSION = 1;
public static final String TB_BOOKMARK = "Bookmark";
public static final String COL_BOOKMARK_KEY = "key";
public static final String COL_BOOKMARK_VALUE = "value";
public static final String COL_BOOKMARK_DATE = "date";
SQLiteDatabase mDB;
public DatabaseHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
if (!ifDBExists(context)) {
if (!copyDBFromAssets(context)) {
throw new RuntimeException("Failed to Copy Database From Assets Folder");
}
}
mDB = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
private boolean ifDBExists(Context context) {
String dbparent = context.getDatabasePath(DBNAME).getParent();
File f = context.getDatabasePath(DBNAME);
if (!f.exists()) {
Log.d("NODB MKDIRS","Database file not found, making directories.");
File d = new File(dbparent);
d.mkdirs();
//return false;
}
return f.exists();
}
private boolean copyDBFromAssets(Context context) {
Log.d("CPYDBINFO","Starting attemtpt to cop database from the assets file.");
String DBPATH = context.getDatabasePath(DBNAME).getPath();
InputStream is;
OutputStream os;
int length = 8192;
long bytes_read = 0;
long bytes_written = 0;
byte[] buffer = new byte[length];
try {
is = context.getAssets().open(DBNAME);
} catch (IOException e) {
Log.e("CPYDB FAIL - NO ASSET","Failed to open the Asset file " + DBNAME);
e.printStackTrace();
return false;
}
try {
os = new FileOutputStream(DBPATH);
} catch (IOException e) {
Log.e("CPYDB FAIL - OPENDB","Failed to open the Database File at " + DBPATH);
e.printStackTrace();
return false;
}
Log.d("CPYDBINFO","Initiating copy from asset file" + DBNAME + " to " + DBPATH);
while (length >= 8192) {
try {
length = is.read(buffer,0,length);
} catch (IOException e) {
Log.e("CPYDB FAIL - RD ASSET",
"Failed while reading in data from the Asset. " +
String.valueOf(bytes_read) +
" bytes read ssuccessfully."
);
e.printStackTrace();
return false;
}
bytes_read = bytes_read + length;
try {
os.write(buffer,0,length);
} catch (IOException e) {
Log.e("CPYDB FAIL - WR ASSET","failed while writing Database File " +
DBPATH +
". " +
String.valueOf(bytes_written) +
" bytes written successfully.");
e.printStackTrace();
return false;
}
bytes_written = bytes_written + length;
}
Log.d("CPYDBINFO",
"Read " + String.valueOf(bytes_read) + " bytes. " +
"Wrote " + String.valueOf(bytes_written) + " bytes."
);
try {
os.flush();
is.close();
os.close();
} catch (IOException e ) {
Log.e("CPYDB FAIL - FINALISING","Failed Finalising Database Copy. " +
String.valueOf(bytes_read) +
" bytes read." +
String.valueOf(bytes_written) +
" bytes written."
);
e.printStackTrace();
return false;
}
return true;
}
}
。
- コンストラクターを変更して、
copyDBFromAssets
を実行します データベースが存在しない場合のメソッド(ifDBExists
を使用) メソッド)
:-
public DatabaseHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
if (!ifDBExists(context)) {
if (!copyDBFromAssets(context)) {
throw new RuntimeException("Failed to Copy Database From Assets Folder");
}
}
mDB = this.getWritableDatabase();
}
- データベースのコピーで問題が発生した場合は、
RunTimeExcpetion
が原因でアプリが停止することに注意してください。 発行されました。
。
- 最後にアクティビティのonCreateメソッド(通常はメインアクティビティ)を修正して、DatabaseHelperクラスのインスタンスを作成します。次に、アプリを実行します(アプリが実行されている場合は、データベース(おそらく空)が作成された場合に備えて、削除する前にアプリのデータを削除することをお勧めします。)
次のコードには、データベースに存在するテーブルを示すクエリも含まれています:-
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DatabaseHelper mDBHlpr = new DatabaseHelper(this);
Cursor csr = mDBHlpr.getWritableDatabase().query(
"sqlite_master",
null,null,null,null,null,null
);
while (csr.moveToNext()) {
Log.d("DB TABLES", csr.getString(csr.getColumnIndex("name")));
}
csr.close();
}
}
スクリーンショットとmy_dic.db
という名前のデータベースファイルに基づく 。ログの出力は次のとおりです:-
06-16 02:28:45.208 4467-4467/? D/NODB MKDIRS: Database file not found, making directories.
06-16 02:28:45.208 4467-4467/? D/CPYDBINFO: Starting attemtpt to cop database from the assets file.
Initiating copy from asset filemy_dic.db to /data/data/com.mydictionaryapp.mydictionaryapp/databases/my_dic.db
Read 12288 bytes. Wrote 12288 bytes.
06-16 02:28:45.224 4467-4467/? D/DB TABLES: Bookmark
sqlite_autoindex_Bookmark_1
android_metadata
- これは次のことを示しています:-
- データベースが存在せず、データベースディレクトリが作成されました(つまり、
data/data/<package name>/databases
) - 12288バイトがアセットファイルからデータベースファイルにコピーされました(つまり、正常にコピーされました)。
- 結果のデータベースには、sqlite_masterテーブル、BookMarkテーブル、android_metadataというテーブル(ロケールを格納するSDKによってAndroidデバイス用に自動的に作成されるテーブル)、およびBookMarkテーブル用に自動的に生成されるインデックスの3つのエントリがあります。
- データベースが存在せず、データベースディレクトリが作成されました(つまり、
後続の問題
基本的に、オブジェクトにはgetClassというメソッドがありません。むしろ、Fragmentの継承されたgetClassメソッドを使用する必要があります。したがって、返されたフラグメントを括弧で囲む必要があります。
だから:-
の代わりにString activeFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container).getClass().getSimpleName();
使用できます:-
String activeFragment = (getSupportFragmentManager().findFragmentById(R.id.fragment_container)).getClass().getSimpleName();
または、次を使用することもできます:-
Fragment activeFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
使用とともに:-
if (activeFragment instanceOf BookmarkFragment) { ...... rest of your code
if (activeFragment.equals(BookmarkFragment.class.getSimpleName())) { ......
を使用する代わりに