Bu makalemde Android kodları kullanarak , proje dışında var olan herhangi bir Sql veritabanı dosyanızı nasıl Android projenize kopyalayabilirsiniz konusunu anlatacağım.
1. SQLite veritabanını hazırlama
Eğer SQLite veritabanı dosyanız varsa , bu ayarları yapmanıza gerek yok.
Sql veritabanı dosyanızı düzenleyebilmek için, Win / Linux / Mac işletim sistemlerinde kullanabileceğiniz sürümleri var olan açık kaynak SQLite Database Browser programını indirmenizi tavsiye ederim.
SQLite Database Browser programını kullanarak Sql dosyanızı açın.Sonrasında programda Execute Sql bölümünü açıp, aşağıdaki sql sorgusunu kullanarak ” android_metadata” tablosunu oluşturun.
1 |
CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US') |
Sonrasında bu tablomuza bir tane kayıt girelim.
1 |
INSERT INTO "android_metadata" VALUES ('en_US') |
Veritabanı dosyanızı Android projenize kopyalabilmek için , veritabanınızdaki tablolarınızın primary id alanlarının adı “_id” olmalıdır.
SQLite Database Browser programında tablonuzu seçtikten sonra Modify Table özeliğini kullanarak aşağıdaki gibi kolaylıkla tablonuzdaki alan ismini değiştirebilirsiniz.
Ve böylelikle kopyalayacağımız SQLite veritabanı dosyamızı hazırlamış olduk…
2. Android uygulamanızdan, oluşturmuş olduğumuz veritabanına ulaşma ve veritabanını kopyalama
İlk önce “assets” adında yeni bir klasör oluşturup, projemize kopyalamak istediğimiz veritabanı dosyasını bu klasör içine koymalıyız.
Android Studio Ide ve Eclipse Ide programında assets klasörünü oluşturmanız gereken yollar:
Android Studio Ide programını kullanıyorsanız ProjeIsmi\app\src\main yolunu takip ederek main dizininin içine
Eclipse Ide programını kullanıyorsanız projenizin ana dizinine assest klasörünü oluşturmalısınız.
Sonrasında SQLiteOpenHelper sınıfından türeterek DatabaseHelper sınıfını oluşturup, şu kodları yazıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
package com.tugbaustundag.harici_sql_veritabanini_projeye_yukleme; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class DatabaseHelper extends SQLiteOpenHelper { static String DB_PATH; //Veritabanı ismini veriyoruz static String DB_NAME = "School"; SQLiteDatabase myDatabase; final Context myContext; public DatabaseHelper(Context context) { super(context, DB_NAME, null, 1); DB_PATH = context.getFilesDir().getParent() + "/databases/"; this.myContext = context; } //Assest dizinine koyduğumuz sql dosyasını, Android projesi içine oluşturma ve kopyalamna işlemi yapıldı.. public void CreateDataBase() { boolean dbExists = checkDataBase(); if (!dbExists) { this.getReadableDatabase(); try { copyDataBase(); } catch (Exception ex) { Log.w("hata","Veritabanı kopyalanamıyor"); throw new Error("Veritabanı kopyalanamıyor."); } } } //Sqlite veritabanı dosyasını açıp, veritabanımı kontrol ediyoruz boolean checkDataBase() { SQLiteDatabase checkDB = null; try { String myPath = DB_PATH + DB_NAME; checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); } catch (Exception ex) { Log.w("hata","Veritabanı açılamadı"); } if (checkDB != null) checkDB.close(); return checkDB != null ? true : false; } ///Assest dizinine koyduğumuz sql dosyasındaki verileri kopyalıyoruz void copyDataBase() { try { 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(); myInput.close(); myOutput.close(); } catch (Exception ex) { Log.w("hata", "Kopya oluşturma hatası."); } } //Veritabannı açma işlemi yapıldı void openDataBase() { String myPath = DB_PATH + DB_NAME; myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); } @Override public synchronized void close() { if (myDatabase != null && myDatabase.isOpen()) myDatabase.close(); super.close(); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
package com.tugbaustundag.harici_sql_veritabanini_projeye_yukleme; import java.util.ArrayList; import android.app.Activity; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //DatabaseHelper sınıfımızdaki CreateDataBase methodunu çağırıp , assest dizinine koymuş //olduğumuz veritabanını,Android projesinin içinde oluşturup,verileri kopyalamasını sağladık... DatabaseHelper dbHelper=new DatabaseHelper(this); try { dbHelper.CreateDataBase(); } catch (Exception ex) { Log.w("hata","Veritabanı oluşturulamadı ve kopyalanamadı!"); } //Proje içine kopyalanmış olan veritabanımızdan verileri listview e yazdırdık SQLiteDatabase db=dbHelper.getReadableDatabase(); String[] getColumnName={"student_name,student_surname"}; Cursor imlec=db.query("student", getColumnName, null, null, null, null, null); ListView listview=(ListView)findViewById(R.id.listview); ArrayList student=new ArrayList(); ArrayAdapter adapter=new ArrayAdapter(this,android.R.layout.simple_spinner_dropdown_item,student); while(imlec.moveToNext()){ String student_name=imlec.getString(imlec.getColumnIndex("student_name")); String student_surname=imlec.getString(imlec.getColumnIndex("student_surname")); String name_surname= student_name+ " "+student_surname; student.add(name_surname); } listview.setAdapter(adapter); imlec.close(); db.close(); } } |
Son olarak ufak bir not: Bu yukarıda anlattığım projemin kodlarını indirmek isterseniz; yapmanız gereken tek şey Github linkine tıklamak.
Mrb
Yeni başladım her kaynağa göz atıyorum bu konuyu az çok anladım.
İnteraktif bir uygulama tasarlamak istiyorum.YemekSepeti gibi.
İnternet sitesi ve ya hazır biz db yok.
Sadece bir admin paneli olacak ve sqllitehelper kullanarak apk düzenlenecek mümkünmü yani bir veritabını class’ı oluşturarak?
Merhabalar,
Sizin yaptığınız aynı kodları yazıyorum ama emulatorde çalıştırdığımda Unfortunately has stopped hatası alıyorum nedeni ne olabilir.
Merhaba,
Aynı anlattığınız şekilde yaptım kodları ancak hata almamama rağmen MainActivity’deki while döngüsüne girmiyor. Neden acaba:((
Merhaba örnek için teşekkürler. Bu listviewde tıklanan değeri başka bir activity de detaylı sorgu nasıl yaptırabiliriz. örneğin. Tuğba ismine tıklandığında diğer activityde notları gözükmesini istediğimizde.
Teşekkürler.
Dediklerinizi yaptım. Ancak dosyayı kopyalamıyor. 🙁
Tuba Hanım merhaba, öncelikle vermiş olduğunuz bilgiler için çok teşekkür ederim. ben c# ta yazlım geliştiriyorum, android yazılım geliştirmeye yeni başladım. c# a çok benziyor kod yapısı,benim sorunum şu, xml den verileri çekip android de yaptığım uygulamanın SQLlite database güncelleyecek bir koda ihtiyacım var. yani yazılım DB yi webdeki bir XML den güncelleyecek. böyle bir uygulama yapabilir miyim. herşey için teşekkürler iyi çalışmalar.
Yaptığınız herşeyi yaptım ama olmadı. “unfortunately,DBdeneme has stopped” hatası alıyorum.nerde hata var çözemedim.
Kolay gelsin .. .:)Çok açıklayıcı bir anlatım fakat telefon uygulamayı açıp kapatıyor nedeni ne olabilir?
Merhaba,
Açılan bu veritabınını sonradan değiştirdiğimde değişiklikler emülatörde görünmüyor. Yardımcı olur musunuz?
Merhaba,
Sqlite db içeren bir uygulamam var. Bilgisayarımdan telefonda çalıştırdığımda herhangi bir sorun yaşamıyorum ancak google playe yükledikten sonra db çalışmıyor.
manifestte şu izinleri verdim.
https://play.google.com/store/apps/details?id=com.betulsahin.havadurumutahminiapp
Elinize sağlık ben çalıştırdım ,
Proje dosyalarını Android studio ile açmadan , Yeni proje oluşturdum dosyaları oluşturup kodları elle yazdım sorun yok db den kayıtları çekip listeliyor çalıştıramayan arkadaşlar söylediğim gibi denesinler çalışacak .
Yeni proje oluştururken altta javayı seçin .