जैसा कि आपको कठिनाइयाँ हो रही हैं, निम्नलिखित कोड के साथ जल्दबाजी में तैयार किया गया ट्यूटोरियल है।
-
SQLite टूल में डेटाबेस और टेबल बनाएं, आवश्यकतानुसार डेटा जोड़ें और फिर इसे सेव करें।
-
डेटाबेस को बंद करें और यह जांचने के लिए इसे फिर से खोलें कि टेबल और डेटा अपेक्षित हैं। यदि परिवर्तन नहीं करते हैं और तब तक 2 दोहराएं जब तक आप सुनिश्चित न हो जाएं कि सहेजा गया डेटाबेस मेल खाता है।
-
सहेजे गए डेटाबेस का फ़ाइल नाम प्राप्त करें और इसे फ़ाइल एक्सटेंशन सहित रिकॉर्ड करें।
-
अगर आपने अभी तक ऐप के लिए प्रोजेक्ट नहीं बनाया है तो ऐसा करें और प्रोजेक्ट को सेव करें।
-
IDE के बाहर प्रोजेक्ट ऐप/src/मुख्य फ़ोल्डर में नेविगेट करें और संपत्ति नाम का एक फ़ोल्डर बनाएं अगर यह पहले से मौजूद नहीं है।
-
डेटाबेस फ़ाइल को एसेट फ़ोल्डर में कॉपी करें।
-
प्रोजेक्ट को Android Studio में खोलें।
-
डेटाबेस हेल्पर . नामक एक नया जावा क्लास बनाएं SuperClass के साथ SQLiteOpenHelper . के रूप में (
android.database.sqlite.SQLiteOpenHelper
का समाधान करेगा ) और चुनें ओवरराइड दिखाएं . पर टिक करें डायलॉग चेकबॉक्स। ओके पर क्लिक करें।
यह दिखना चाहिए :-
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 के डेटाबेस में परिभाषित किए गए रिस्पेटिस टेबल/कॉलम नामों से होना चाहिए।
- DBVERSION डेटाबेस के user_version फ़ील्ड में संग्रहीत संस्करण संख्या होगी।
- SQliteDatabase mDB एक वैरिएबल के लिए एक घोषणा है जो SQLiteDatabase को खोले जाने पर होल्ड करने के लिए है। ध्यान दें कि वर्तमान में इसका मान सेट होने तक शून्य है।
।
-
Databasehelper वर्ग के लिए कंस्ट्रक्टर को इस से बदलें :-
सार्वजनिक डेटाबेस हेल्पर (संदर्भ संदर्भ, स्ट्रिंग नाम, SQLiteDatabase.CursorFactory फ़ैक्टरी, इंट संस्करण) {सुपर (संदर्भ, नाम, फ़ैक्टरी, संस्करण);}
करने के लिए :-
public DatabaseHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
}
- इससे ऐसा होता है कि डेटाबेस हेल्पर वर्ग का एक उदाहरण सिर्फ एक पैरामीटर, संदर्भ के साथ बनाया जा सकता है। अन्य मूल्यों को परिभाषित किया गया है या कारखाने के मामले में किसी का भी उपयोग नहीं किया जाएगा, इसलिए शून्य यह दर्शाता है।
।
- एक विधि जोड़ें,
ifDBExists
डेटाबेस हेल्पर वर्ग में यह देखने के लिए कि क्या डेटाबेस मौजूद है (आप इसे केवल एक बार संपत्ति फ़ाइल से कॉपी करना चाहते हैं)
:-
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;
}
- ध्यान दें कि यह जानबूझकर लंबा-चौड़ा है, ताकि किसी भी विफलता को इंगित किया जा सके।
अब पूरा डेटाबेस हेल्पर वर्ग होगा :-
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
के कारण ऐप को रोक दिया जाएगा। जारी किया गया।
।
- डेटाबेस हेल्पर वर्ग का एक उदाहरण बनाने के लिए गतिविधि की ऑनक्रिएट विधि (आमतौर पर मुख्य गतिविधि होगी) में अंतिम संशोधन करें। फिर ऐप चलाएं (यदि ऐप चलाया गया है तो ऐसा करने से पहले ऐप के डेटा को हटाना सबसे अच्छा होगा, बस एक डेटाबेस, शायद खाली, बनाया गया है।)
निम्नलिखित कोड में एक क्वेरी भी शामिल है जो आपको बताएगी कि डेटाबेस में कौन सी तालिकाएँ मौजूद हैं :-
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 तालिका के लिए एक स्वचालित रूप से उत्पन्न अनुक्रमणिका। ली>
- डेटाबेस मौजूद नहीं था और डेटाबेस निर्देशिका बनाई गई थी (यानी
बाद का अंक
मूल रूप से ऑब्जेक्ट में 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())) { ......