Android खोज संवाद का उपयोग करना। भाग 3 - कस्टम सुझाव

छवि

यह एंड्रॉइड सर्च डायलॉग (पिछले वाले यहां और यहां हैं ) का उपयोग करने पर अंतिम लेख है। इसमें, मैं आपको बताऊंगा कि डायलॉग में डायनामिक सर्च हिंट को कैसे जोड़ा जाए, साथ ही सिस्टम क्विक सर्च बॉक्स (QSB) में अपने एप्लिकेशन में खोज को कैसे एकीकृत किया जाए। क्यूएसबी का लाभ यह है कि इसकी मदद से आप ओएस में लगभग कहीं से भी जानकारी प्राप्त कर सकते हैं।


सिद्धांत


आपके द्वारा खोजे जा रहे एप्लिकेशन में डेटा का उपयोग करके खोज संकेत बनाए जाते हैं। जब उपयोगकर्ता उनमें से एक का चयन करता है, तो खोज प्रबंधक गतिविधि को इरादे भेजता है, जो खोज के लिए जिम्मेदार है। आमतौर पर, जब उपयोगकर्ता संवाद में खोज आइकन पर क्लिक करता है, तो खोज का एक प्रकार भेजा जाता है, हालांकि, जब इस मामले में शीघ्रता का चयन करते हैं, तो आप एक अन्य प्रकार के इरादे को परिभाषित कर सकते हैं, ताकि हम इसे इंटरसेप्ट कर सकें और उचित कार्रवाई कर सकें, उदाहरण के लिए, एक नया संवाद बनाना, या कॉलिंग गतिविधि जानकारी प्रदर्शित करने के लिए, आदि।
खोज क्वेरी डेटा पहले की तरह इरादे से स्थानांतरित किया जाता है, लेकिन अब हम सामग्री प्रदाता के माध्यम से अनुरोध के प्रकार को निर्धारित करने के लिए यूआरआई का उपयोग करेंगे।

फिर से, हमें डायलॉग रेंडर करने के लिए कोई क्रिया करने की आवश्यकता नहीं है, यह सर्च मैनेजर द्वारा किया जाता है, जो कि हम सभी के लिए जरूरी है कि वह एक कॉन्फ़िगरेशन xml फ़ाइल सबमिट करे।

इसलिए, जब खोज प्रबंधक खोज के लिए जिम्मेदार और खोज के लिए संकेत प्रदान करने के लिए हमारी गतिविधि को परिभाषित करता है, तो क्रियाओं के निम्नलिखित अनुक्रम होते हैं:
  1. जब खोज प्रबंधक खोज क्वेरी का पाठ प्राप्त करता है, तो वह संकेत प्रदान करने वाले सामग्री प्रदाता को अपना अनुरोध भेजता है।
  2. सामग्री प्रदाता खोज क्वेरी के पाठ से मेल खाने वाले संकेत की ओर इशारा करते हुए एक कर्सर लौटाता है।
  3. खोज प्रबंधक कर्सर का उपयोग करके टूलटिप्स प्रदर्शित करता है

संकेतों की सूची प्रदर्शित होने के बाद, निम्नलिखित हो सकता है:

इसलिए, हम अपने आवेदन को संशोधित करते हैं (जो कि भाग 1 में चर्चा की गई थी) ताकि गतिशील टूलटिप्स जोड़े जाएं, और, तंत्र को बाहर निकालने के लिए, टूलटिप चुनने पर, हम एक नई गतिविधि कहेंगे, जो अनुरोध पर जानकारी प्रदर्शित करेगी। कार्यान्वयन के लिए आपको आवश्यकता होगी:


कॉन्फ़िगरेशन फ़ाइल बदलें


मैं आपको याद दिलाता हूं कि डायलॉग को प्रदर्शित करने और इसे बदलने के लिए कॉन्फ़िगरेशन फ़ाइल (रेस / xml / searchable.xml) की आवश्यकता होती है, उदाहरण के लिए, आवाज खोज का उपयोग करने के लिए। डायनामिक संकेत का उपयोग करने के लिए, आपको पैरामीटर जोड़ना होगा: android: searchSuggestAuthority फ़ाइल में। यह सामग्री प्रदाता के प्राधिकरण स्ट्रिंग से मेल खाएगा। इसके अलावा, हम पैरामीटर एंड्रॉइड जोड़ते हैं: searchMode = "queryRewriteFromText", इसका मान इंगित करता है कि डायलॉग में खोज स्ट्रिंग को नेविगेट करते समय ओवरराइट किया जाएगा, उदाहरण के लिए, ट्रैकबॉल का उपयोग करके। हम चयन ऑपरेटर को निर्दिष्ट करने वाले मापदंडों को भी जोड़ेंगे, टूलटिप के चुने जाने पर भेजे गए इरादे का प्रकार, और सामग्री प्रदाता से अनुरोध करने के लिए संवाद में टाइप किए गए पात्रों की न्यूनतम संख्या।

फ़ाइल रेस / xml / searchable.xml
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/search_hint" android:searchSettingsDescription="@string/settings_description" android:searchMode="queryRewriteFromText" android:includeInGlobalSearch="true" android:searchSuggestAuthority="com.example.search.SuggestionProvider" android:searchSuggestIntentAction="android.intent.action.VIEW" android:searchSuggestIntentData="content://com.example.search.SuggestionProvider/records" android:searchSuggestThreshold="1" android:searchSuggestSelection=" ?"> </searchable> 


एक सामग्री प्रदाता बनाएँ


वास्तव में, हमारा कंटेंट प्रदाता दूसरों से अलग नहीं है। लेकिन आपको यह सुनिश्चित करने की आवश्यकता है कि संकेतों की तालिका से प्रत्येक पंक्ति के लिए आवश्यक कॉलम चुने गए हैं, जिन्हें खोज प्रबंधक द्वारा आवश्यक है। हम सामग्री प्रदाता क्वेरी () विधि का उपयोग करके संकेतों के लिए डेटा क्वेरी करेंगे। इसके अलावा, यह हर बार कहा जाएगा कि उपयोगकर्ता संवाद में एक नया चरित्र टाइप करता है। इस प्रकार, क्वेरी () पद्धति को क्वेरी से मेल खाने वाले तालिका में रिकॉर्ड पर कर्सर को वापस करना चाहिए, और फिर खोज प्रबंधक प्रदर्शन को प्रदर्शित करने में सक्षम होंगे। कोड टिप्पणियों में विधि का विवरण देखें।
अनुरोध पाठ स्वयं URI से जोड़ा जाएगा, इसलिए इसे प्राप्त करने में कोई समस्या नहीं होगी, आपको बस मानक getLastPathSegment () विधि का उपयोग करने की आवश्यकता है।

एक संकेत तालिका बनाना


जब खोज प्रबंधक अभिलेखों की ओर इशारा करते हुए एक कर्सर प्राप्त करता है, तो यह प्रत्येक रिकॉर्ड के लिए कॉलम के एक विशिष्ट सेट की अपेक्षा करता है। दो अनिवार्य हैं: _ID प्रत्येक टूलटिप का विशिष्ट पहचानकर्ता है, और SUGGEST_COLUMN_TEXT_1 टूलटिप पाठ है।
कई वैकल्पिक कॉलम हैं, उदाहरण के लिए, SUGGEST_COLUMN_ICON_1 का उपयोग करके, आप प्रत्येक रिकॉर्ड को टूलटिप के बाईं ओर प्रदर्शित आइकन (बहुत सुविधाजनक, उदाहरण के लिए, संपर्क खोजने के लिए) के लिए परिभाषित कर सकते हैं।

आशय के लिए डेटा प्रकार परिभाषा


चूंकि हम एक यूआरआई के माध्यम से अनुरोध पर डेटा प्रसारित करते हैं, इसलिए हमें यह निर्धारित करने के लिए एक तंत्र की आवश्यकता है कि कौन सा टूलटिप चुना गया था। इसके दो तरीके हैं। पहला एक अलग कॉलम SUGGEST_COLUMN_INTENT_DATA को परिभाषित करना है, जिसमें प्रत्येक रिकॉर्ड के लिए अद्वितीय डेटा होगा, फिर आप GetData () या getDataString () के माध्यम से इंटेंट से डेटा प्राप्त कर सकते हैं। दूसरा विकल्प कॉन्फ़िगरेशन फ़ाइल (res / xml / searchable.xml) में सभी इरादों के लिए डेटा प्रकार निर्धारित करना है और फिर SUGGEST_COLUMN_INTUM_DATA_ID कॉलम का उपयोग करके URI के प्रत्येक इरादे के लिए अद्वितीय डेटा जोड़ें।
हम दूसरे विकल्प का उपयोग करेंगे, और मैंने तालिका में अलग-अलग कॉलम नहीं बनाए हैं, क्योंकि आप SUGGEST_COLUMN_INTENT_DATA_ID से तालिका की पंक्ति में मैपिंग बना सकते हैं। मैं जोड़ूंगा कि SQLite में खेल हित के लिए, FTS3 का उपयोग खोज के लिए किया गया था , अर्थात , मुझे एक वर्चुअल टेबल बनानी थी, जिसके लिए आप स्तंभों (बाधाओं) पर प्रतिबंध नहीं लगा सकते हैं, जैसे कि PRIMARY KEY या पूर्ण / नहीं NULL। लेकिन वर्चुअल टेबल में एक अद्वितीय पंक्ति पहचानकर्ता होता है, और मैपिंग को इसमें सेट करता है। यही है, इरादे के डेटा में निम्नलिखित रूप होंगे: "/" और तालिका में पंक्ति की पंक्ति को URI में जोड़ा जाएगा।

सूचना प्रदर्शित करने के लिए एक गतिविधि बनाना


इंटरफ़ेस रेस / लेआउट / record_activity.xml में है। वह सभी गतिविधि जो इंटेंट से डेटा प्राप्त करती है, एक सामग्री प्रदाता के माध्यम से एक कर्सर का अनुरोध करें, और एक पाठ क्षेत्र में रिकॉर्ड प्रदर्शित करें।

फ़ाइल रेस / लेआउट / record_activity.xml
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp"> <TextView android:id="@+id/record_header" android:textSize="25dp" android:textColor="?android:textColorPrimary" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout> 


अब हम प्रकट में सामग्री प्रदाता और नई गतिविधि के बारे में जानकारी दर्ज करेंगे, साथ ही, चूंकि अब हमारे पास दो गतिविधियाँ हैं, हम डिफ़ॉल्ट रूप से खोज के लिए ज़िम्मेदार व्यक्ति को इंगित करेंगे।

AndroidManifest.xml फ़ाइल
 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.search" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Main" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> <activity android:name=".RecordActivity" android:theme="@android:style/Theme.NoTitleBar" /> <provider android:name=".SuggestionProvider" android:authorities="com.example.search.SuggestionProvider" /> <meta-data android:name="android.app.default_searchable" android:value=".Main" /> </application> <uses-sdk android:minSdkVersion="5" /> </manifest> 

खोज के प्रभारी गतिविधि में इरादे को रोकना


उपरोक्त सभी चरणों के बाद, आपको मुख्य गतिविधि में इरादे को संसाधित करने की आवश्यकता है, जो खोज के लिए जिम्मेदार है। चूंकि हमने टूलटिप्स के लिए इंटेंट प्रकार को व्यू के रूप में परिभाषित किया है, इसलिए हमें केवल इसके लिए एक चेक जोड़ने की आवश्यकता है। यदि शर्त पूरी हो जाती है, तो रिकॉर्डअक्टिविटी इंटेंट का उपयोग करके लॉन्च की जाती है, जिसमें डेटा तालिका में URI + "/" + टूलटिप लिखा जाता है।

त्वरित खोज बॉक्स एकीकरण


कस्टम सुझावों का उपयोग करने के लिए अपने आवेदन को संशोधित करने के बाद, आप इसे सिस्टम खोज में जोड़ सकते हैं। ऐसा करने के लिए, searchable.xml फ़ाइल में दो पैरामीटर जोड़ें:
  1. एंड्रॉइड: इनग्लोबलसर्च = "सत्य" को शामिल करता है - इंगित करता है कि क्यूएसबी आपके आवेदन को खोज सकता है।
  2. android: searchSettingsDescription = "@ string / settings_description" - आपके एप्लिकेशन के विवरण को इंगित करता है, जो त्वरित खोज बॉक्स सेट करते समय प्रदर्शित होता है। ये सेटिंग सेटिंग्स-> सर्च में हैं।

ये विकल्प Android 1.6 से उपलब्ध हैं, अर्थात, नीचे दिए गए संस्करणों के लिए, आप QSB के लिए अपने आवेदन को कॉन्फ़िगर नहीं कर सकते।

स्रोत कोड


मैं सभी आवश्यक कक्षाओं का पूर्ण स्रोत कोड प्रस्तुत करता हूं। Main.java - मुख्य गतिविधि जो सामग्री प्रदाता के लिए अनुरोधों को खोजने और भेजने के लिए जिम्मेदार है, RecordActivity.java - एक विशिष्ट रिकॉर्ड के लिए डेटा के साथ एक आशय प्राप्त करता है, रिकॉर्ड के लिए एक लिंक प्राप्त करता है और जानकारी प्रदर्शित करता है। SuggestionProvider.java एक सामग्री प्रदाता है जो खोज प्रबंधक से अनुरोधों की तालिका के लिए अनुरोध करता है। RecordsDbHelper.java - तालिका बनाने, उसे भरने, आवश्यक प्रदर्शन स्थापित करने और "मिलान" रिकॉर्ड के लिए स्वयं जिम्मेदार है।

Main.java फ़ाइल
 package com.example.search; import android.app.ListActivity; import android.app.SearchManager; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.SimpleCursorAdapter; import android.widget.Toast; public class Main extends ListActivity { private EditText text; private Button add; private RecordsDbHelper mDbHelper; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mDbHelper = new RecordsDbHelper(this); Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { //     String query = intent.getStringExtra(SearchManager.QUERY); //  showResults(query); } else if (Intent.ACTION_VIEW.equals(intent.getAction())){ // Intent   RecordActivity Intent recordIntent = new Intent(this, RecordActivity.class); recordIntent.setData(intent.getData()); startActivity(recordIntent); finish(); } add = (Button) findViewById(R.id.add); text = (EditText) findViewById(R.id.text); add.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { String data = text.getText().toString(); if (!data.equals("")) { saveTask(data); text.setText(""); } } }); } private void saveTask(String data) { mDbHelper.createRecord(data); } private void showResults(String query) { //  -    Cursor cursor = managedQuery(SuggestionProvider.CONTENT_URI, null, null, new String[] {query}, null); if (cursor == null) { Toast.makeText(this, "There are no results", Toast.LENGTH_SHORT).show(); } else { //  String[] from = new String[] { RecordsDbHelper.KEY_DATA }; int[] to = new int[] { R.id.text1 }; SimpleCursorAdapter records = new SimpleCursorAdapter(this, R.layout.record, cursor, from, to); getListView().setAdapter(records); } } //     (  res/menu/main_menu.xml) public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); return true; } public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.search_record: onSearchRequested(); return true; default: return super.onOptionsItemSelected(item); } } } 


फाइल रिकॉर्डअक्टिविटी.जावा
 package com.example.search; import android.app.Activity; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.TextView; public class RecordActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.record_activity); // URI    Intent     - Uri uri = getIntent().getData(); Cursor cursor = managedQuery(uri, null, null, null, null); if (cursor == null) { finish(); } else { //     cursor.moveToFirst(); TextView record = (TextView) findViewById(R.id.record_header); int rIndex = cursor.getColumnIndexOrThrow(RecordsDbHelper.KEY_DATA); record.setText(cursor.getString(rIndex)); } } //         @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.search_record: onSearchRequested(); return true; default: return false; } } } 


फ़ाइल सुझाव
 package com.example.search; import android.app.SearchManager; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.net.Uri; import android.provider.BaseColumns; public class SuggestionProvider extends ContentProvider{ private RecordsDbHelper mDbHelper; public static String AUTHORITY = "com.example.search.SuggestionProvider"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/records"); //MIME   getType() public static final String RECORDS_MIME_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd.example.search"; public static final String RECORD_MIME_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + "/vnd.example.search"; //   URI private static final int SEARCH_RECORDS = 0; private static final int GET_RECORD = 1; private static final int SEARCH_SUGGEST = 2; private static final UriMatcher sURIMatcher = makeUriMatcher(); @Override public boolean onCreate() { mDbHelper = new RecordsDbHelper(getContext()); return true; } /** *    Search Manager'a. *    ,    URI. *      ,     selectionArgs   . *    . */ @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // UriMatcher,      .       switch (sURIMatcher.match(uri)) { case SEARCH_SUGGEST: if (selectionArgs == null) { throw new IllegalArgumentException( "selectionArgs must be provided for the Uri: " + uri); } return getSuggestions(selectionArgs[0]); case SEARCH_RECORDS: if (selectionArgs == null) { throw new IllegalArgumentException( "selectionArgs must be provided for the Uri: " + uri); } return search(selectionArgs[0]); case GET_RECORD: return getRecord(uri); default: throw new IllegalArgumentException("Unknown Uri: " + uri); } } private Cursor getSuggestions(String query) { query = query.toLowerCase(); String[] columns = new String[] { BaseColumns._ID, RecordsDbHelper.KEY_DATA, SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID}; return mDbHelper.getRecordMatches(query, columns); } private Cursor search(String query) { query = query.toLowerCase(); String[] columns = new String[] { BaseColumns._ID, RecordsDbHelper.KEY_DATA}; return mDbHelper.getRecordMatches(query, columns); } private Cursor getRecord(Uri uri) { String rowId = uri.getLastPathSegment(); String[] columns = new String[] { RecordsDbHelper.KEY_DATA}; return mDbHelper.getRecord(rowId, columns); } /** *   *     URI   */ private static UriMatcher makeUriMatcher() { UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); //   matcher.addURI(AUTHORITY, "records", SEARCH_RECORDS); matcher.addURI(AUTHORITY, "records/#", GET_RECORD); //   matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH_SUGGEST); matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH_SUGGEST); return matcher; } //  (   ContentProvider) @Override public String getType(Uri uri) { switch (sURIMatcher.match(uri)) { case SEARCH_RECORDS: return RECORDS_MIME_TYPE; case SEARCH_SUGGEST: return SearchManager.SUGGEST_MIME_TYPE; case GET_RECORD: return RECORD_MIME_TYPE; default: throw new IllegalArgumentException("Unknown URL " + uri); } } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { throw new UnsupportedOperationException(); } @Override public Uri insert(Uri uri, ContentValues values) { throw new UnsupportedOperationException(); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { throw new UnsupportedOperationException(); } } 


फ़ाइल रिकॉर्ड्सDHHperper.java
 package com.example.search; import java.util.HashMap; import android.app.SearchManager; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteQueryBuilder; import android.provider.BaseColumns; import android.util.Log; public class RecordsDbHelper { //    -  public static final String KEY_DATA = SearchManager.SUGGEST_COLUMN_TEXT_1; private static final String TAG = "RecordsDbHelper"; private DatabaseHelper mDbHelper; private SQLiteDatabase mDb; private static final String DATABASE_NAME = "datas"; private static final String DATABASE_TABLE = "records"; private static final int DATABASE_VERSION = 2; //   private static final String DATABASE_CREATE = "CREATE VIRTUAL TABLE " + DATABASE_TABLE + " USING fts3 (" + KEY_DATA + ");"; private static final HashMap<String,String> mColumnMap = buildColumnMap(); /** *  ,     rowId * @param rowId id   * @param columns   ;  null,   * @return ,    , null -      */ public Cursor getRecord(String rowId, String[] columns) { String selection = "rowid = ?"; String[] selectionArgs = new String[] {rowId}; return query(selection, selectionArgs, columns); } /** *  ,    ,    * @param query    * @param columns   ;  null,   * @return ,   ,   , null -      */ public Cursor getRecordMatches(String query, String[] columns) { String selection = KEY_DATA + " MATCH ?"; String[] selectionArgs = new String[] {query+"*"}; return query(selection, selectionArgs, columns); } /** *     . *      SQLiteQueryBuilder. *   ,        SUGGEST_COLUMN_INTENT_DATA_ID *        URI. */ private static HashMap<String,String> buildColumnMap() { HashMap<String,String> map = new HashMap<String,String>(); map.put(KEY_DATA, KEY_DATA); map.put(BaseColumns._ID, "rowid AS " + BaseColumns._ID); map.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, "rowid AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID); return map; } /** * * @param selection   * @param selectionArgs ,  "?"     * @param columns    * @return ,    ,     */ private Cursor query(String selection, String[] selectionArgs, String[] columns) { /* SQLiteBuilder       *   ,     - *   . */ SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); builder.setTables(DATABASE_TABLE); builder.setProjectionMap(mColumnMap); Cursor cursor = builder.query(mDbHelper.getReadableDatabase(), columns, selection, selectionArgs, null, null, null); if (cursor == null) { return null; } else if (!cursor.moveToFirst()) { cursor.close(); return null; } return cursor; } /** */  */ private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS records"); onCreate(db); } } public RecordsDbHelper(Context context) { mDbHelper = new DatabaseHelper(context); } /** *     * @param data ,    * @return id ,  -1,     */ public long createRecord(String data) { mDb = mDbHelper.getWritableDatabase(); ContentValues initialValues = new ContentValues(); initialValues.put(KEY_DATA, data); return mDb.insert(DATABASE_TABLE, null, initialValues); } } 


पूरा प्रोजेक्ट code.google.com पर लिया जा सकता है
आपका ध्यान के लिए धन्यवाद!

Source: https://habr.com/ru/post/In111961/


All Articles