2016-04-12 13 views
1

Şu anda bir .sql dosyasına yazılan yaklaşık 100.000 sorgu için çok sayıda ekleme sorgusunu okuman gereken bir gereksinim var. Bu dosyayı SdCard'dan okumalı ve uygulamada yerel sqlite veritabanını güncellemeliyim. Başarılı güncelleme ile kodunun altına kullanıyorumSqlite Android'de dosyadan okunan Ekle sorgularının tonları nasıl çalıştırılır

: Aynı zamanda

Ben performans sorunu ve uygulama riski daha ağır sql dosyasının bir görev gibi olacak ne zaman askıda konusunda endişelerim var. Şu anda kullandığım yaklaşımı değiştirmem gerekiyor mu? Sqlite Database ile herhangi bir risk olmadan bu görevi gerçekleştirmek için daha iyi bir uygulama var mı.

/* Iterate through lines (assuming each insert has its own line 
    and theres no other stuff) */ 
while (insertReader.ready()) { 
    String insertStmt = insertReader.readLine(); 
    db.execSQL(insertStmt); 

    bytesRead += insertStmt.length(); 
    int percent = (int) (bytesRead * 100/totalBytes); 

    // To show the updating data progress 
    if (previousPercent < percent) { 
     System.out.println(percent); 
     previousPercent = percent; 
     Bundle b = new Bundle(); 
     b.putInt(AppConstants.KEY_PROGRESS_PERCENT, percent); 
     Message msg = new Message(); 
     msg.setData(b); 
     errorViewhandler.sendMessage(msg); 
    } 
    result++; 
} 
insertReader.close(); 

cevap

3

Ben senin veritabanına çok veri almak için hızlı yolu ContentProvider üzerinde applyBatch() kullanmak olduğunu bulduk. applyBatch bir örnek uygulama olarak

ArrayList<ContentProviderOperation> cpoList = new ArrayList<ContentProviderOperation>(); 

while (condition) { 
    ContentProviderOperation.Builder b = ContentProviderOperation.newInsert(YourOwnContentProvider.CONTENT_URI); 
    b.withYieldAllowed(true); 

    b.withValue(COLUMN_ONE, 1); 
    b.withValue(COLUMN_TWO, 2); 

    cpoList.add(b.build()); 

    // You could check here, whether you have a lot of items in your list already. If you do, you should send them to applyBatch already. 
} 

if(cpoList.size() > 0) { 
    context.get().getContentResolver().applyBatch(YourOwnContentProvider.AUTHORITY, cpoList); 
} 

:

@Override 
public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) { 
    ContentProviderResult[] result = new ContentProviderResult[operations.size()]; 
    int i = 0; 
    SQLiteDatabase sqlDB = db.getWritableDatabase(); 

    sqlDB.beginTransaction(); 

    try { 
     for (ContentProviderOperation operation : operations) { 
      result[i++] = operation.apply(this, result, i); 
     } 

     sqlDB.setTransactionSuccessful(); 
    } catch (OperationApplicationException e) { 
     // Deal with exception 
    } finally { 
     sqlDB.endTransaction(); 
    } 

    return result; 
} 
+0

umut verici görünüyor ama EPGContentprovider net değilim ve gerçekleştirimdir İşte

benim projelerden biri düşürüldü bir örnektir. SdCard'da bulunan bir Dosyadan okuduğum ekleme sorgularına varabilir miyim? –

+0

Bu ContentProvider aslında içerdiğim koddan ContentProvider. Bu durumda kendi içerik sağlayıcınızı oluşturmanız gerekir. – Knossos

+0

Ve evet, herhangi bir kaynaktan yeni satır ekleyebilirsin. Yani Dosya da işe yarayacak. Dosya parçasını while döngüsünde parçalara ayırmanız yeterlidir. – Knossos

İlgili konular