SQLite etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
SQLite etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

21 Mart 2018 Çarşamba

SQLiteDatabase Sınıfı

Giriş
Şu satırı dahil ederiz.
import android.database.sqlite.SQLiteDatabase;
Açıklaması şöyle.
Android wraps the SQLite code and export some java interface (android.database.sqlite.SQLiteDatabase), but miss some advanced features from the original SQLite implementation

1.Custom Function
2.Encryption
3.URI file syntax
4.VFS
Dosya Nerede Olmalı
Sqlite verisinin Android Studio projelerin asset dizini altında olması tavsiye ediliyor.
+ main
++ assets
+++ db.sqlite <----
++ java
++ res
Yanlışlıkla res dizini altına konabilir. res dizini altında assets diye bir şey yok.
+ res
++ drawable
++ layout
++ menu
++ mipmap
++ values
constructor
SQLiteOpenHelpersınıfından kalıtan bir sınıf içinde şöyle yaparız
SQLiteDatabase db = getWritableDatabase ()
beginTransaction-endTransaction metodları
Açıklaması şöyle
The changes will be rolled back if any transaction is ended without being marked as clean (by calling setTransactionSuccessful).
Basit bir örnek
SQLiteDatabase db = ...
db.beginTransaction();
db.execSQL("ALTER TABLE ...");
db.setTransactionSuccessful();
db.endTransaction();
close metodu
Şöyle yaparız.
if(db.isOpen())
  db.close();
compileStatement metodu
Bir PreparedStatement oluşturur. Şöyle yaparız.
String sql = "...";
SQLiteStatement insert = db.compileStatement(sql);
execSQL metodu
Verilen SQL'i çalıştırır. Örneğin tablo yaratmak için kullanabiliriz.
SQLiteDatabase db = ...
db.execSQL("CREATE TABLE IF NOT EXISTS users_table (name TEXT, last TEXT)");
Satır eklemek için kullanabiliriz.
db.execSQL("INSERT INTO users_table VALUES('" + name + "','" + last + "'");
getMaximumSize metodu
Metodun içi şöyle. Sanırım teorik bir limit dönüyor.
public long getMaximumSize() {
  long pCount = DatabaseUtils.longForQuery(this, "PRAGMA max_page_count;", null);
 return pCount * getPageSize();
}
insert metodu
Şu satırı dahil ederiz.
import android.content.sqlite.ContentValues;
ContentValues nesnesinin değerleri ile satır yaratır. İşlem başarısız ise -1 döner. Başarılı ise RowID döner. Eğer RowID autogenerated ise değeri 1'den başlar.
ContentValues values = new ContentValues();
values.put(KEY_PRODUCT_TYPE, code);
values.put(KEY_PRODUCT_QUANTITY, continent);
values.put(KEY_PRODCUT_COST, region);

long rowId = db.insert (SQLITE_TABLE, null, values);

isOpen metodu
Şöyle yaparız.
if(db.isOpen())
  db.close();
query metodu
Şöyle bir sorgu çalıştırmak isteyelim.
SELECT * FROM Customers
WHERE City LIKE '%XXXX%';
Şöyle yaparız. Parametreler sırasıyla şöyledir.table, columns, selection, selectionArgs, groupBy, having, orderBy, limit
Cursor cursor = db.query("Customers",
  null, "City LIKE ?", new String[] { "%" + name + "%" }, 
  null,
  null,
  null);
rawQuery metodu
Cursor almak için kullanılabilir.
String selectQuery = "SELECT * FROM ...";
SQLiteDatabase db = ...
Cursor cursor = db.rawQuery(selectQuery, null);
setTransactionSuccessful metodu
Şöyle yaparız.
SQLiteDatabase db = 
db.beginTransaction();
...
db.setTransactionSuccessful();
db.endTransaction();


29 Kasım 2017 Çarşamba

SQLiteOpenHelper Sınıfı

Giriş
Şu satırı dahil ederiz.
import android.database.sqlite.SQLiteOpenHelper;
Bu sınıf veritabanının kendisini yönetmek için var.

constructor - Context
Şöyle yaparız.
public class DatabaseHelper extends SQLiteOpenHelper {
  private static final String DB_NAME = "mytable";
  private static final int DB_VERSION = 1;

  public DatabaseHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
  }
  ...
}
Bu sınıf bir activity içinde onCreate metodunda yaratılır. Sınıfı yaratmak için activity "this" olarak constructor'a geçilir.
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.register);
  // initialize `helper` here
  helper = new DatabaseHelper(this);
  ....
}
Eğer istersek singleton da yapılabilir. Ama ben bu yöntemi sevmiyorum. O zaman şöyle yaparız.
DatabaseHelper.getInstance(context).someFunction(...);
delete metodu
3 parametre alır. İlk parametre tablo ismi, ikinci parametre sql, üçüncü parametre sql parametreleridir.

getReadableDatabase metodu
Şöyle elde ederiz.
SQLiteDatabase db = myDatabaseHelper.getReadableDatabase();
db.query () yapılabilir.

getWritableDatabase metodu
Şöyle elde ederiz.
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
db.write yapılabilir.

insert metodu
3 parametre alır. İlk parametre tablo ismi, üçüncü parametre ContentValues nesnesidir.

Örnek
Şöyle yaparız.
void createFoo(Foo foo)
{
  SQLiteDatabase db = this.getWritableDatabase();

  ContentValues values = new ContentValues();
  values.put(KEY_NAME, foo.name);
  values.put(KEY_ID, foo.id);

  // Inserting Row
  db.insert(TABLE_FOO, null, values);

  db.close(); // Closing database connection
}
Örnek
Eğer istersek veritabanına yazma işlemini ayrı bir metoda taşıyabiliriz. Şöyle yaparız.
long internalInsert(SQLiteDatabase db, Foo obj)
{
  ContentValues values = new ContentValues();
  values.put(KEY_NAME, ...);
  values.put(KEY_ID, ...);

  return db.insert(TABLE_FOO, null, values);
}
onCreate metodu
Tabloyu yaratır.
public void onCreate(SQLiteDatabase db){
  String createTable = "CREATE TABLE mytable (...)";
  db.execSQL(createTable);
}

onUpgrade metodu
onUpgrade metodunun ilk parametresi SQLiteDatabase. Dolayısıyla bu sınıfın metodlarını kullanabiliriz.
Örnek - alter table
Şöyle yaparız.
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

  // If you want to add a column
  if (newVersion > oldVersion) {
    db.execSQL("ALTER TABLE ADD_NAME ADD COLUMN NEW_COLOUM INTEGER DEFAULT 0");
  }
}
Örnek - drop table
Şöyle yaparız.


public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
  db.execSQL("Drop TABLE IF EXISTS" + DB_NAME);
  onCreate(db);
}
query metodu
Cursor nesnesi döner.
Örnek
Şöyle yaparız.
Foo getFoo (int id)
{
  SQLiteDatabase db = this.getReadableDatabase();

  Cursor cursor = db.query(TABLE_FOO, new String[] { KEY_ID,
    KEY_NAME}, KEY_ID + "=?",
    new String[] { String.valueOf(id) }, null, null, null, null);
  if (cursor != null)
    cursor.moveToFirst();

  Foo foo = new Foo (Integer.parseInt(cursor.getString(0)),
            cursor.getString(1));
  // return contact
  return foo;
}
rawQuery metodu
Cursor nesnesi döner. 2 parametre alır. İlk parametre sql, ikinci parametre sql parametreleridir.

Örnek
Şöyle yaparız.
Cursor cursor= db.rawQuery( "select id from contacts where email='a'",null);
Örnek
Şöyle yaparız.
ArrayList<Foo> getAllContents()
{
  ArrayList<Foo> array_list = new ArrayList<>();

  SQLiteDatabase db = this.getReadableDatabase();
  
  String selectQuery = "SELECT  * FROM " + TABLE_ITEM;
  Cursor res = db.rawQuery(selectQuery, null);
  res.moveToFirst();

  while (res.isAfterLast() == false)
  {
    Foo foo= new Foo();
    ...

  array_list.add(hashmap);
  res.moveToNext();
  }
  return array_list;
}
Örnek
Şöyle yaparız.
Cursor cursor = db.rawQuery("... ", null);

if (cursor.moveToFirst())
{
  do
  {
    long id = cursor.getLong(cursor.getColumnIndexOrThrow(ID));
    String title =  cursor.getString(cursor.getColumnIndexOrThrow(TITLE));
    ...
    list.add(new Foo(id, title);
  }
  while (cursor.moveToNext());
}
cursor.close();
return list;
update metodu
4 parametre alır. İlk parametre tablo ismi, ikinci parametre ContentValues nesnesi, üçüncü parametre where koşulu için sql, dördüncü parametre sql parametreleridir.
Şöyle yaparız.
public int updateFoo(Foo foo)
{
  SQLiteDatabase db = this.getWritableDatabase();

  ContentValues values = new ContentValues();
  values.put(KEY_NAME, foo.name);


  // updating row
  return db.update(TABLE_FOO, values, KEY_ID + " = ?",
    new String[] { String.valueOf(foo.id) });
}