Turkcell | Geleceği Yazanlar

Soru & Cevap

Gerçek Cihazda Database sorunu

29.10.2013 - 14:07

Database fazlasıyla ihtiyaç duyduğum uygulamaları emulatorde çalıştırabiliyorum, cihazımda çalıştıramıyorum. Cihazın rootlanmış olması gerekiyormuş. Peki markete koyacak olursam uygulamamı, indirecek cihazların rootlanmış mı olması gerekiyor? Cevap hayır sanırım ama nasıl çalışıyor bu sefer?

4006 Görüntülenme

4 Cevap

Enes Şen
31.10.2013 - 16:46

Selamlar,

Cevaplarda dikkatimi çeken şu oldu. Pathler hardcoded olarak verilmiş ancak uygulamanın update olması durumunda pathin sonuna "-2" gibi değerler gelebiliyor. İşte bu yüzden uygulamanın data path ini almak için Context.getApplicationInfo().dataDir değerini kullanmanız ileride oluşacak hataları düzeltecektir.

kolaylıklar...

Sitede yorum yapabilmek için giriş yapın ya da üye olun.

İbrahim Gündüz
30.10.2013 - 20:38

Merhabalar Cüneyt, bu işlemleri veri tabanı işlemeri için yazdığınız sınıf içerisinde yapmanız gerekecek. Yazmış olduğunuz sınıf SQLiteOpenHelper sınıfını extends ettiğini düşünüyorum.

size gerekli methodlar şunlar
:
private static String DB_PATH = "/data/data/com.igunduz91.kigem/databases/";
 private static String DB_NAME;

public void createDatabase() throws IOException {
        boolean dbExist = checkDataBase();
        
        if(dbExist) {
            
        } else {
            this.getReadableDatabase();
            try {
                copyDataBase();
                Log.d(LOGCAT,"Copy Data Base");
            } catch(IOException e) {
                throw new Error("Error copying database");
            }
        }
    }
    
    private boolean checkDataBase() {
        File dbFile = new File(DB_PATH + DB_NAME);
        return dbFile.exists();
    }
    
    private void copyDataBase() throws IOException {
        InputStream myInput = myContext.getAssets().open(DB_NAME);
        
        String outFileName = DB_PATH + DB_NAME;
    
        OutputStream myOutput = new FileOutputStream(outFileName);
        
        byte[] buffer = new byte[1024];
        int length;
        while((length = myInput.read(buffer))>0) {
            myOutput.write(buffer, 0, length);
        }
        
        myOutput.flush();
        myOutput.close();
        myInput.close();
    }

 

bu methodları yazmış olduğunuz veri tabanı sınıfının constructor'ında şu şekilde kullanmanız gerekmektedir :

try {
       createDatabase();
 } catch (IOException e) {
        throw new Error("Unable to create database");
  }     

burdan şu şekilde bir olay oluşur, uygulamayı kullanıcı açtığında db sınıfı işlem gördüğünde kod bakacak.   eğer benim veritabanım /data/data/com.igunduz91/kigem.sqlite dosyası var mı yok mu? eğer yok ise assert içinde ki db dosyasını oraya kopyalayacak. her db işleminde bu şekilde bir kontrol yapılacak.

*not bu şekilde bir db yi kopyalamakta 1mb üzerie dosyalarda problem oluşuyor. android sistem yapısı 1mb üzeri dosyaları bu şekilde kopyalamada sıkıntı oluşturuyor.

benim önerim ve yaptığım; hazır veri tabanı sunacağım uygulamaları bulut alt yapısı içerisinde sunuyorum.

https://play.google.com/store/apps/developer?id=İbrahim+Gündüz

iki uygulamamda bulut alt yapılı...

Sitede yorum yapabilmek için giriş yapın ya da üye olun.

Cüneyt
30.10.2013 - 02:29

Aynı şeyden söz ediyoruz evet ama bu işlemler sonucunda cihazda çalışmasını mı bekliyoruz? Öyleyse çalışmıyor çünkü? Cihazın data/data klasörleri açılmıyor. Açılmazmış da rootlanmadan.

Sitede yorum yapabilmek için giriş yapın ya da üye olun.

İbrahim Gündüz
29.10.2013 - 20:12

sqlite ile çalıştığınızı düşünüyorum? uygulamalarınız için hazır doldurulmuş bir db kullanmak istiyorsanız, bunun için assert klasörüne attığınız kigem.sqlite dbnizi uygulama çalıştırıldığı zaman /data/data/packname(com.igunduz91.kigem)/database/kigem.sqlite olarak taşımalısınız.

Aynı şeyden söz ediyorsak biraz daha ayrıntılı bilgi verebilirim.

Sitede yorum yapabilmek için giriş yapın ya da üye olun.

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.