SQLite
 sql >> база данни >  >> RDS >> SQLite

Как да попълните ListView с db в папката с активи?

Първо трябва да се отбележат няколко точки.

  • 1 - казахте, че файлът е FoodDB.db но след това каза, че базата данни се нарича foodDatabase.db . Името на базата данни е името на файла. Като такъв в следващия пример се използва FoodDB.db като файла, който е в активите (можете да преименувате файла, когато копирате от активите, но не съм го направил в този отговор.)

  • 2 - Нямате нужда от помощник за база данни и примерът не го използва.

Те са две части :-

  • 1) Достъп до базата данни за извличане на данните за ListView. В следващия пример това се копира от активите в стандартното местоположение на базата данни (/data/data/the_package/databases/the_database_name ).

    • Направено е предположението, че след като бъде копирана от активите, базата данни ще бъде използвана впоследствие (т.е. копирана е веднъж за целия живот на приложението).
  • 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 метод връща SQLiteDatabase след копиране на if от файла с активи, ако базата данни не съществува. Методът ще върне 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLite JSON_VALID()

  2. Таблицата на база данни на Android SQLite не се създава

  3. Android Room Database, извличане на конкретна стойност на последния въведен запис

  4. Защо получавам java.lang.IllegalArgumentException:стойността на свързване при индекс 1 е нула в този случай?

  5. Android - По-добър подход при зареждане на изображения от SD КАРТА