2016-04-02 20 views
0

Veritabanımı önceden doldurmak istiyorum. Bu yüzden, tarayıcıdan SQL sorguları oluşturup bunları db'ye eklemek için kod yazdım. Bu tek satır sorgu için iyi çalışıyor ama çoğu ekleme sorgularıAndroid, her bir Ekleme sorgusu için birden çok satıra sahip olan dosyadan Db'ye veri ekleme

INSERT INTO `poem` VALUES (780,'سلام القلب واشواقه 

من قلب يحب مجنونه 

ياليت هالقلب يحن 


ويقول هالدنيا 

ماتسوى دون *_*','0',NULL);` 

Benim gereksinimi oldukları gibi onları eklemektir `örneğin çoklu çizgi var. Yani ben birden hattı için yazdığı yöntem

public static int countLines(InputStream is) throws IOException { 
    try { 
     byte[] c = new byte[1024]; 
     int count = 0; 
     int readChars = 0; 
     boolean empty = true; 
     int index = 0; 

     while ((readChars = is.read(c)) != -1) { 
      empty = false; 
      String temp = new String(c); 
      for (int i = 0; i < readChars; i++) { 

       if (c[i] == ';' && index == 0) { 
        index++; 
       } else if (c[i] == '\n' && index == 1) { 
        index++; 
       } else if (c[i] == '\t' && index == 2) { 
        index++; 
       } else if (c[i] == 'I' && index == 3) { 
        count++; 
        index = 0; 
       } else { 
        i -= index; 
        index = 0; 
       } 
      } 
     } 
     return (count == 0 && !empty) ? 1 : count + 1; 
    } finally { 
     is.close(); 
    } 
} 

Herkes nasıl DB dosyadan böyle sorguları eklemek için fikrim yok (tek hat sorgusu için mükemmel çalışır) 'dir.? Herhangi bir yardım harika olurdu. Teşekkürler

+0

Herhangi biri? yardım et??? –

+0

Neden sadece [uygulamayı DB ile gönderiyorsunuz] (http://stackoverflow.com/questions/513084/how-to-ship-an-android-application-with-a-database)? –

cevap

0

ben ekleme sorguları (bazı satırlı sorguları dahil) ile sona erer içerirler bir .sql dosyası oluşturmak adım

tarafından çözüm adımıdır.

SQLiteOpenHelper benim onCreate() yöntemimde getFileLineCount() kullanarak dosyamın satırlarını sayıyorum. Bu yöntem bana hat sayısını geri verir. Bu satır sayısı hiçbir zaman kullanılmaz, fakat bende tüm sorularınız tek satırsa, oyuna girebilir. Bu yöntemi atlayabilirsiniz.

public void onCreate(SQLiteDatabase db) { 
      db.execSQL("CREATE TABLE \"" + TABLE_POEM + "\" (\"" + POEM_LOCAL_ID + "\" INTEGER PRIMARY KEY AUTOINCREMENT , \"" + POEM_TEXT + "\" TEXT,\"" + POEM_ID + "\" INTEGER , \"" + POEM_IS_FAV + "\" TEXT);"); 

      int totalLineCount = getFileLineCount("poem.sql"); 
      int insertCount = insertFromFile(db, "poem.sql", totalLineCount); 

      Log.d("DatabaseHelper", "------------onCreate(SQLiteDatabase db) >>>>>>> completed--------"); 
     } 
    private int getFileLineCount(String assetFilePath) { 
     InputStream insertStream = null; 
     int totalCount = 0; 
     try { 
      insertStream = context.getAssets().open(assetFilePath); 
      totalCount = FileUtil.countLines(new BufferedInputStream(insertStream)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (insertStream != null) { 
       try { 
        insertStream.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     return totalCount; 
    } 

Bu yöntemi kullanarak, dosyadan sorgular ekliyorum. Hem tek satır sorguları hem de çok satırlı sorguları işler. Öncelikle satırın ";" içerip içermediğini kontrol ediyorum, hattın bitmediği anlamına geliyor. Oldukça basit, sonunda oldu.

while ((currentLine = insertReader.readLine()) != null) { 
          if (currentLine.length() != 0) { 
           if (currentLine.charAt(currentLine.length() - 1) == ';') { 
            insertInDb(db, insertStr + "\n" + currentLine); 
            insertStr = ""; 
           } else { 
            insertStr += currentLine; 
           } 
          } 
         } 




private int insertFromFile(SQLiteDatabase db, String assetFilePath, int totalCount) { 
      int result = 0; 
      BufferedReader insertReader = null; 
      try { 
       InputStream insertStream = context.getAssets().open(assetFilePath); 
       insertReader = new BufferedReader(new InputStreamReader(insertStream)); 

       db.beginTransaction(); 

       while (insertReader.ready()) { 

        // String insertStr = insertReader.toString(); 

        String insertStr = ""; 
        String currentLine; 
        while ((currentLine = insertReader.readLine()) != null) { 
         if (currentLine.length() != 0) { 
          if (currentLine.charAt(currentLine.length() - 1) == ';') { 
           insertInDb(db, insertStr + "\n" + currentLine); 
           insertStr = ""; 
          } else { 
           insertStr += currentLine; 
          } 
         } 
        } 

       } 
       db.setTransactionSuccessful(); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       if (insertReader != null) { 
        try { 
         insertReader.close(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
       db.endTransaction(); 
      } 

      return result; 
     } 

     private void insertInDb(SQLiteDatabase db, String assetFilePath) throws IOException { 
      if (assetFilePath != null && assetFilePath.length() > 0) { 
       SQLiteStatement statement = db.compileStatement(assetFilePath); 
       statement.execute(); 

      } 

     } 

Bu tekniği db'ye 4000 kayıt eklemek için kullandım. Ve gecikmeden çok çalışıyordu. Bunun için herhangi bir meyilli çözüm varsa. Lütfen postalayın.

0

Ne soruyorsun, çirkin bir şeyler yapmanın bir yolu. Önceden doldurulmuş veritabanları ve tabloları oluşturmak için sqliteassethelper kullanın. SQLiteOpenHelper'a çok benzer şekilde çalışır, bu yüzden kullanımı çok kolaydır. Herkes aynı konuyu İşte

sahip olması durumunda geç cevap için üzgünüm

+0

çok fazla çirkin değil. Ama bu şarttır. Müşteri bu şekilde istiyor. Bu arada yardımın için teşekkürler, ben sorunu çözüyorum. –

+0

Zaten çözdüyseniz, çözümü buraya yapıştırın. Birileri – suku

+0

'un yakında yayınlanmasına yardımcı olabilir. –