2010-10-26 14 views
6

मेरे पास ज्यादातर स्ट्रिंग ऑब्जेक्ट्स का प्रीबिल्ड डेटाबेस है। मैं जानना चाहता हूं कि मेरी एपीके फ़ाइल में कैसे रखा जाए ताकि डेटाबेस पहले ही बनाया जा सके जब उपयोगकर्ता डेटाबेस स्थापित करता है।.apk फ़ाइल में मौजूदा डेटाबेस को कैसे रखा जाए?

उत्तर

10

मैं इस का एक अच्छा उदाहरण पाया: Using your own SQLite database in Android applications

मूल रूप से, आप एक एसक्यूएल फ़ाइल के रूप में बनाया डेटाबेस निर्यात और संपत्ति-फ़ोल्डर में संग्रहीत। पहले प्रोग्राम शुरू होने पर, आप फ़ाइल के डेटा को अपने अंतिम डेटाबेस में आयात करते हैं।

मुझे लगता है कि यह सबसे अच्छा तरीका है, हालांकि आपका डेटा कुछ और भंडारण स्थान का उपयोग करके एपीके और डीबी में दो बार होगा।

+1

अच्छा लेख, मददगार था – schwiz

8

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

import android.database.sqlite.SQLiteDatabase; 
import kiwidrew.staticdb.StaticDatabase; 

public class BlahBlah extends Activity { 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    SQLiteDatabase db = StaticDatabase.openDatabase(this, "assets/foobar.db"); 
    // Do normal database stuff with 'db'... 
    } 
} 

आप केवल प्रतिबंध जा रहा है कि यह लेखन का समर्थन नहीं करता के साथ एक मानक SQLiteDatabase वस्तु वापस मिलता है। (जाहिर है!)

ध्यान दें कि यह तब तक असफल हो जाएगा जब तक कि संपीड़न के बिना आपके .apk में डेटाबेस संग्रहीत न हो जाए। SQLite डेटाबेस aapt -0 आदेश का उपयोग करें या अपने build.xml संशोधित <aapt> टैग करने के लिए <nocompress extension="db" /> ध्वज पारित करने के लिए ...

http://bitbucket.org/kiwidrew/android-staticdb पर कोड प्राप्त करें।

नोट: मैंने सचमुच इसे लिखना समाप्त कर दिया है, और अभी तक बहुत ही बुनियादी परीक्षण किया है। बग रिपोर्ट की सराहना की जाएगी!

1

सीधे संपत्ति से डेटाबेस पढ़ने का कोई आसान तरीका नहीं है। आपको अपने डेटाबेस को संपत्तियों से पहले फ़ोल्डर में डेटा फ़ोल्डर में प्रतिलिपि बनाना चाहिए, फिर जब भी आपका ऐप शुरू होता है, तो आपको डेटा फ़ोल्डर में डेटाबेस जांचना चाहिए और डेटाबेस मौजूद नहीं होने पर इसे दोबारा कॉपी करना चाहिए।

ये कदम तुम्हारी मदद:

1) अपने डेटाबेस पर इन आदेश पर अमल, अगर android_metadata तालिका अपने डेटाबेस में मौजूद नहीं है, एंड्रॉयड अपने डेटाबेस .: खुल नहीं सका

CREATE TABLE android_metadata(locale TEXT DEFAULT 'en_US') 
INSERT INTO android_metadata VALUES('en_US') 

2) हिस्सा आपका डेटाबेस क्योंकि एंड्रॉइड एक फ़ाइल को पढ़ने का समर्थन नहीं करता है जो संपत्ति से 1 एमबी आकार से अधिक है।

यह अजगर कोड अपने डेटाबेस मात्रा:

def chunk_file(file_name): 
    input_file = open(file_name, "rb") 

    chunk_counter = 0; 
    while True: 
     chunk = input_file.read(512 * 1024) # 512 KB 
     if chunk: 
      output_file_name = file_name + "." + str(chunk_counter).zfill(4) 

      output_file = open(output_file_name, "wb") 
      output_file.write(chunk) 
      output_file.close() 

      chunk_counter += 1 
     else: 
      break 

    input_file.close() 
    return 

# Input: database.db 
# Output: database.db.0000, database.db.0001, database.db.0002, ... 
chunk_file("database.db") 

फिर database.db.0000, database.db.0001, database.db.0002, ... संपत्ति फ़ोल्डर में डाल दिया।

3) ऐप शुरू होने पर डेटा फ़ोल्डर में डेटाबेस मौजूद है।

public static boolean databaseExists() { 

    boolean result = false; 

    SQLiteDatabase checkDB = null; 

    try { 
     checkDB = SQLiteDatabase.openDatabase(
       getApplicationContext().getFilesDir().getPath() + "/database.db", 
       null, SQLiteDatabase.OPEN_READONLY); 
     result = true; 
    } catch (SQLiteException exception) { 
     result = false; 
    } 

    if (checkDB != null) { 

     checkDB.close(); 

    } 

    return result; 
} 

4) यदि डेटाबेस डेटा फ़ोल्डर में मौजूद नहीं है, तो डेटाबेस से डेटा फ़ोल्डर में डेटा कॉपी करें।

public static void copyDatabase() throws IOException { 
    AssetManager assets = getApplicationContext().getAssets(); 

    // database.db.0000, database.db.0001, database.db.0002, ... --> databaseChunks. 
    String[] databaseChunks = assets.list(""); 
    Arrays.sort(databaseChunks); 

    OutputStream databaseStream = new FileOutputStream(
      getApplicationContext().getFilesDir().getPath() + "/database.db"); 

    for (int i = 0; i < databaseChunks.length; i++) { 
     String databaseChunkName = databaseChunks[i]; 

     InputStream chunkStream = assets.open(databaseChunkName); 

     int length; 
     byte[] buffer = new byte[1024]; 
     while ((length = chunkStream.read(buffer)) > 0) { 
      databaseStream.write(buffer, 0, length); 
     } 

     chunkStream.close(); 
    } 

    databaseStream.close(); 

    return; 
} 

5) अब आप डेटाबेस से कनेक्ट कर सकते हैं:

SQLiteDatabase database = SQLiteDatabase.openDatabase(
      getApplicationContext().getFilesDir().getPath() + "/database.db", 
      null, SQLiteDatabase.OPEN_READONLY); 
// ... 
database.close(); 
संबंधित मुद्दे