SQLite
 sql >> डेटाबेस >  >> RDS >> SQLite

संपत्ति फ़ोल्डर में डीबी के साथ ListView को कैसे पॉप्युलेट करें?

पहले कुछ बिंदुओं पर ध्यान दिया जाना चाहिए।

  • 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 लौटाती है। समस्या होने पर विधि शून्य हो जाएगी।

    • यदि डेटाबेस मौजूद है तो लॉग में एक संदेश होगा जैसे 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 डेटाबेस में छवि सम्मिलित कर सकते हैं?

  2. SQLiteException ऐसी कोई तालिका नहीं:संकलन करते समय ItemTable:Select_id,... ItemTable से

  3. Android SQLite डेटाबेस यूनिट परीक्षण

  4. sqlite से खोजे गए डेटा को वापस करें

  5. SQLite में यूनिक्स टाइमस्टैम्प वापस करने के 2 तरीके