Android ile Harici SQLite Dosyası ile Çalışma

Android ile Harici SQLite Dosyası ile Çalışma

Öncelikle projemiz içerisinde Database paketi oluşturup, bu paket içerisinde DatabaseHelper isimli class oluşturunuz.

package com.serifgungor.yemektarifleriapp.Database;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.compat.BuildConfig;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class DatabaseHelper extends SQLiteOpenHelper {
private Context myContext;
private static String DB_NAME = "MyDatabase.db";
private static String DB_PATH = "";
private static int DATABASE_VERSION = 1;
public SQLiteDatabase myDatabase;

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {

}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
if (i > i1)
{
Log.v("Database Upgrade", "Database version higher than old.");
deleteDatabase();
}
}

public DatabaseHelper(Context context) throws IOException{
super(context,DB_NAME,null,DATABASE_VERSION);
this.myContext = context;
boolean dbExists = checkDatabase();
DB_PATH = "/data/data/"+context.getPackageName()+"/databases/";

if(dbExists){
Log.d("DB_LOG","Database bulundu !");
}else{
try{
if(createDatabase()==true){
Log.d("DB_LOG","Database oluşturuldu !");
}else{
Log.d("DB_LOG","Database oluşturulamadı !");
}
}catch (Exception e){
Log.d("DB_LOG","Database oluşturulamadı !");
}
}

}

public boolean createDatabase() throws IOException{
boolean dbExists = checkDatabase();
// checkDatabase metodu ile database varmı/yokmu kontrolü yap
if(dbExists){ //database varsa
return true;
}else{ // database yoksa
this.getReadableDatabase();
try {
this.close();
copyDatabase();
}catch (IOException e){
throw new Error("Database kopyalanma hatası");
}
return false;
}
}

public boolean checkDatabase(){
boolean checkdb = false;

try{
String dosyaKonumu = DB_PATH + DB_NAME;
File dbFile = new File(dosyaKonumu);
checkdb = dbFile.exists();
}catch (SQLiteException e){
Log.d("DB_LOG","Database bulunamadı");
}

return checkdb;
}

private void copyDatabase() throws IOException{
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
InputStream myInput = myContext.getAssets().open(DB_NAME);

byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0)
{
myOutput.write(buffer, 0, length);
}
myInput.close();
myOutput.flush();
myOutput.close();
}

public void openDatabase(){
String myPath = DB_PATH + DB_NAME;
myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}

public void deleteDatabase()
{
File file = new File(DB_PATH + DB_NAME);
if(file.exists())
{
file.delete();
if(file.delete()==true){
Log.d("DB_LOG","Database file deleted on apk in database file");
}else{
Log.d("DB_LOG","Database file do not deleted !");
}
}
}

public synchronized void close(){
if (myDatabase != null){
myDatabase.close();
}
super.close();
}

}

MyDatabase.db dosyasını harici SQLite Editör yazılımları yardımı ile tablo ve satırları ekleyip, .db uzantılı dosya elde ediniz ve oluşturulan dosyayı, main klasörü içerisine assets isimli özel klasörü oluşturarak içerisine taşıyınız.

ardından ilgili Database'i nerede kullanacaksanız, Örneğin MainActivity için düşünecek olursak, onCreate metodu içerisindeyken;

DatabaseHelper databaseHelper;
SQLiteDatabase db;
Cursor c;

try{
	dbHelper = new DatabaseHelper(getApplicationContext());
	dbHelper.createDatabase();
	db = dbHelper.getReadableDatabase();
	c = db.rawQuery("Select * from TabloAdi order by id desc",null);
	while(c.moveToNext()){
		Log.i("DB_LOG",c.getInt(0)+" "+c.getString(1));
	}

}catch(Exception e){
	Log.e("DB_LOG",e.getMessage());
Log.e("DB_LOG","Veritabanı oluşturulamadı veya kopyalanamadı !"); }

İlgili satırları açıklayacak olursak;

Cursor db.rawQuery ile içerisine gönderdiğimiz select sorgusundan bize geri dönen satırları tek tek gezebilmemiz için kullanılmaktadır.

While döngüsü şartı olarak c.moveToNext() metodu ile sorguda bize dönen, son okuyabildiği satıra kadar veri dönebilmesini temsil eder.

id(int) isim(varchar)
1 şerif
2 kadir

c.getInt(0) dediğimizde -> 0. kolonun integer tipte bir değere denk gelmiş olmasından dolayı getInt(0) dedik.

c.getString(1) ile -> 1. kolonun varchar tipte, text tipinde olması durumlarından dolayı getString(1) dedik.

İnsert / Update / Delete Sorguları

Not: Normal sqlite sorgularından hiçbir farkı yok fakat, harici database ile birlikte çalıştığımız zamanlarda database dosyasını assets klasörü içerisinden kopyalayıp uygulama önbelleği içerisine alacağımızdan dolayı önbelleği temizleme durumlarında tekrar okuyabileceği assets içerisindeki database içerisindeki tablolar ve satırlar dikkate alınmış olacaktır.

Delete Sorgusu

dbHelper = new DatabaseHelper(getApplicationContext());
dbHelper.createDatabase();
db = dbHelper.getReadableDatabase();
db.execSQL("delete from TableName where id=5"); yada db.delete("TableName","id = ?",new String[]{String.valueOf("5")}); db.close();

Insert Sorgusu

dbHelper = new DatabaseHelper(getApplicationContext());
dbHelper.createDatabase();
db = dbHelper.getReadableDatabase();
db.execSQL("insert into TableName values("NULL,'şerif güngör blog'")); yada ContentValues values = new ContentValues(); values.put("isim","şerif güngör blog"); db.insert("TableName",null,values); db.close();

Update Sorgusu

dbHelper = new DatabaseHelper(getApplicationContext());
dbHelper.createDatabase();
db = dbHelper.getReadableDatabase(); db.execSQL("update TableName set isim='yeni değer' where id=1"); yada ContentValues values = new ContentValues(); values.put("isim","yeni değer"); db.update("TableName",values,"id = ?",new String[]{String.valueOf("1")}); db.close();

Harici SQLite ile neden çalışılır ?

Android Uygulamanızın yüklendiği herhangi bir cihaz tarafından verileri girilmiş, açıldığında verilerin yüklü şekilde çalışması gereken uygulamalar olabilir. Örneğin: Rüya Tabirleri, İnternetsiz Yemek Tarifleri

Bu makaleyi paylaşın:
İstanbul'da yaşıyorum.Web üzerinde Frontend/Backend Geliştirmenin yanı sıra, Android Geliştirme, PHP/ASP.NET, C# Yazılım Uzmanlığı ve Java konuları işliyorum. Kod Şiirdir, onları seviyorum.

Bir yorum bırakın