sql >> データベース >  >> RDS >> SQLite

ListViewにアセットフォルダーのdbを取り込む方法は?

    最初に注意すべき点がいくつかあります。

    • 1-ファイルはFoodDB.dbであるとおっしゃいました しかし、データベースは foodDatabase.dbと呼ばれていると言いました 。データベース名はファイル名です。そのため、次の例では FoodDB.dbを使用しています アセット内のファイルとして(アセットからコピーするときにファイルの名前を変更できますが、この回答では変更していません)

    • 2-データベースヘルパーは必要ありません。この例ではデータベースヘルパーを使用していません。

    2つの部分があります:-

    • 1)データベースにアクセスして、ListViewのデータを抽出します。次の例では、これはアセットから標準のデータベースの場所( / data / data / the_package / databases / the_database_name )にコピーされます。 )。

      • アセットからコピーされると、データベースはその後使用されると想定されています(つまり、アプリの存続期間中に1回コピーされます)。
    • 2)抽出されたデータ(カーソルとして取得)をListViewに表示します。

    2を行うには、次のレイアウトが使用されているため、ListViewを含むレイアウトが必要になります。 activity_main.xml :-

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="fooddb.so49328656populatelistview.MainActivity">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            />
        <ListView
            android:id="@+id/foodlist"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </ListView>
    </LinearLayout>
    
    • tools:context="fooddb.so49328656populatelistview.MainActivity" あなたのパッケージを反映する必要があります

    データベースヘルパー-警告として使用されません

    呼び出しアクティビティMainActivity.java (注を参照):-

    public class MainActivity extends AppCompatActivity {
    
        static final String DBNAME = "FoodDB.db";
        static final String DBASSETPATH = "databases/" + DBNAME;
        static final String FOODTABLE = "dataset";
        static final String FOODCOLUMN = "Food";
        static final String IDCOLUMN = "ID";
    
        ListView mFoodList;
        SQLiteDatabase mDB;
        SimpleCursorAdapter mSCA;
        Cursor mCsr;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mFoodList = (ListView) this.findViewById(R.id.foodlist);
            mDB = openFoodDB();
            if (mDB != null) {
                mCsr = mDB.query(FOODTABLE,
                        new String[]{IDCOLUMN + " AS _id",
                                FOODCOLUMN
                        },
                        null,null,null,null,null);
                mSCA = new SimpleCursorAdapter(this,android.R.layout.simple_list_item_1,mCsr,
                        new String[]{FOODCOLUMN},
                        new int[]{android.R.id.text1},0);
                mFoodList.setAdapter(mSCA);
            } else {
                Toast.makeText(this,"Unable to open Database.",Toast.LENGTH_LONG);
            }
        }
    
        private SQLiteDatabase openFoodDB() {
            String dbpath = this.getDatabasePath(DBNAME).getPath();
            if (this.getDatabasePath(DBNAME).exists()) {
                Log.d("OPENFOODDB","Opening already existing Database");
                return SQLiteDatabase.openDatabase(dbpath,null,SQLiteDatabase.OPEN_READWRITE);
            }
            InputStream is;
            byte[] buffer;
            FileOutputStream db;
            try {
                 is =  this.getAssets().open(DBASSETPATH);
                 buffer = new byte[is.available()];
                 is.read(buffer);
                 is.close();
            } catch (Exception e) {
                e.printStackTrace();
                Log.d("OPENFOODDB","Unable to locate or buffer input from assets " + DBASSETPATH);
                return null;
            }
            // Just in case the databases directory doesn't exist create it.
            File dbmkdir = (this.getDatabasePath(DBNAME)).getParentFile();
            dbmkdir.mkdirs();
            try {
                db = new FileOutputStream(this.getDatabasePath(DBNAME).getPath());
            } catch (Exception e) {
                e.printStackTrace();
                Log.d("OPENFOODDB","Unable to create outputstream for DB at path " + dbpath);
                try {
                    is.close();
                } catch (Exception e2) {
                }
                return null;
            }
            try {
                db.write(buffer);
                db.flush();
                db.close();
                is.close();
            } catch (Exception e) {
                Log.d("OPENFOODDB","Failed to copy asset to DB");
                e.printStackTrace();
                return null;
            }
            return SQLiteDatabase.openDatabase(dbpath,null,SQLiteDatabase.OPEN_READWRITE);
        }
    }
    

    メモ

    • openFoodDB データベースが存在しない場合、メソッドはアセットファイルからifをコピーした後にSQLiteDatabaseを返します。問題が発生した場合、メソッドはnullを返します。

      • データベースが存在する場合、ログにはD/OPENFOODDB: Opening already existing Databaseのようなメッセージが含まれます。
      • データベースがアセットファイルからコピーされ、正常に開かれた場合、ログメッセージは表示されません。メッセージは、問題がある場合にのみログに記録されます。
      • たとえば、アセットファイルが見つからない場合は、ログにD/OPENFOODDB: Unable to locate or buffer input from assets databases/FoodDB.dbのようなメッセージが表示されます。 これの前にスタックトレースがあります

    例えば:-

    03-16 22:17:04.008 1529-1529/? W/System.err: java.io.FileNotFoundException: databases/FoodDB.db
    03-16 22:17:04.008 1529-1529/? W/System.err:     at android.content.res.AssetManager.openAsset(Native Method)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at android.content.res.AssetManager.open(AssetManager.java:315)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at android.content.res.AssetManager.open(AssetManager.java:289)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at fooddb.so49328656populatelistview.MainActivity.openFoodDB(MainActivity.java:63)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at fooddb.so49328656populatelistview.MainActivity.onCreate(MainActivity.java:37)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at android.app.Activity.performCreate(Activity.java:5008)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at android.app.ActivityThread.access$600(ActivityThread.java:130)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:99)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at android.os.Looper.loop(Looper.java:137)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:4745)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at java.lang.reflect.Method.invoke(Method.java:511)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    03-16 22:17:04.008 1529-1529/? W/System.err:     at dalvik.system.NativeStart.main(Native Method)
    
    • CursorAdapterには、特に _idという名前の列が必要です。 したがって、IDCOLUMN + " AS _id"を使用します 。

    結果:-




    1. MySQLロールバッククエリ

    2. Oracleのテーブルでのシーケンスギャップの検索

    3. BLOBOracle10gへの画像の挿入

    4. MySQLでSTRAIGHT_JOINを使用する場合