Ana içeriğe atla

23. Android’e Deprem İçerik Sağlayıcısı Oluşturmak ve Kullanmak (SQLite)

1.    ContentProvider’ı genişleten yeni bir EarthquakeProvider sınıfı yaratın. onCreate, getType, query, insert, delete ve update metotlarını hükümsüz kılacak koçanları içerin.

package com.paad.earthquake;
import android.content.*;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
public class EarthquakeProvider extends ContentProvider {
  @Override
  public boolean onCreate() {
  }
  @Override
  public String getType(Uri uri) {
  }
  @Override
  public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sort) {
    }
  @Override
  public Uri insert(Uri _uri, ContentValues _initialValues) {
  }
  @Override
  public int delete(Uri uri, String where, String[] whereArgs) {
    }
  }
  @Override
  public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
  }
}

2.    Bu sağlayıcı için URI’yi yayınlayın. Bu URI, ContentResolver ile diğer uygulama bileşenleri içindeki içerik sağlayıcıya erişmekte kullanılacak.

  public static final Uri CONTENT_URI = Uri.parse("content://com.paad.provider.earthquake/earthquakes");

3.    Depremleri depolamakta kullanılacak veritabanını yaratın. EartquakeProvider içinde yeni bir SQLiteDatabase somut nesnesi yaratın ve sütun adlarını ve indeklerini tanımlayan açık değişkenleri açığa çıkartın. Veritabanı yaratımı ve sürüm kontrolünü yönetmek için SQLiteOpenHelper’ın bir uzantısını içerin.

  private SQLiteDatabase earthquakeDB;
  private static final String TAG = "EarthquakeProvider";
  private static final String DATABASE_NAME = "earthquakes.db";
  private static final int DATABASE_VERSION = 1;
  private static final String EARTHQUAKE_TABLE = "earthquakes";
  public static final String KEY_ID = "_id";
  public static final String KEY_DATE = "date";
  public static final String KEY_DETAILS = "details";
  public static final String KEY_LOCATION_LAT = "latitude";
  public static final String KEY_LOCATION_LNG = "longitude";
  public static final String KEY_MAGNITUDE = "magnitude";
  public static final String KEY_LINK = "link";
  public static final int DATE_COLUMN = 1;
  public static final int DETAILS_COLUMN = 2;
  public static final int LONGITUDE_COLUMN = 3;
  public static final int LATITUDE_COLUMN = 4;
  public static final int MAGNITUDE_COLUMN = 5;
  public static final int LINK_COLUMN = 6;
  private static class earthquakeDatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_CREATE =
      "create table " + EARTHQUAKE_TABLE + " ("
      + KEY_ID + " integer primary key autoincrement, "
      + KEY_DATE + " LONG, "
      + KEY_DETAILS + " TEXT, "
      + KEY_LOCATION_LAT + " FLOAT, "
      + KEY_LOCATION_LNG + " FLOAT, "
      + KEY_MAGNITUDE + " FLOAT, "
      + KEY_LINK + " TEXT);";
    public earthquakeDatabaseHelper(Context context, String name, CursorFactory factory, int version) {
      super(context, name, factory, version);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
      db.execSQL(DATABASE_CREATE);          
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
      Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                  + newVersion + ", which will destroy all old data");
      db.execSQL("DROP TABLE IF EXISTS " + EARTHQUAKE_TABLE);
      onCreate(db);
    }
  }
}

4.    Farklı URI’leri kullanarak istekleri yönetmek için bir UriMatcher yaratın. Tüm veri seti (QUAKES) ve bir deprem indeks değeri (QUAKE_ID) ile eşleşen tek bir kayıt üzerinde sorgular ve işlemler için destek ekleyin.

  private static final int QUAKES = 1;
  private static final int QUAKE_ID = 2;
  private static final UriMatcher uriMatcher;
  static {
   uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
   uriMatcher.addURI("com.paad.provider.Earthquake", "earthquakes", QUAKES);
   uriMatcher.addURI("com.paad.provider.Earthquake", "earthquakes/#", QUAKE_ID);
  }

5.    Desteklenen her URI yapısına bir digi döndürecek getType metodu hükümsüz kılın.

  @Override
  public String getType(Uri uri) {
    switch (uriMatcher.match(uri)) {
      case QUAKES: return "vnd.android.cursor.dir/vnd.paad.earthquake";
      case QUAKE_ID: return "vnd.android.cursor.item/vnd.paad.earthquake";
      default: throw new IllegalArgumentException("Unsupported URI: " + uri);
    }
  }

6.    Veritabanı yardımcı sınıfının yeni bir somut nesnesini yaratmak için sağlayıcının onCreate idarecisini hükümsüz kılın ve veritabanına bir bağlantı açın.

  @Override
  public boolean onCreate() {
    Context context = getContext();
    earthquakeDatabaseHelper dbHelper;
    dbHelper = new earthquakeDatabaseHelper(context, DATABASE_NAME,
                                            null, DATABASE_VERSION);
    earthquakeDB = dbHelper.getWritableDatabase();
    return (earthquakeDB == null) ? false : true;
  }

7.    Sorgu ve işlem koçanlarını gerçekleyin. URI’ye dayalı yapılan isteği çözecek query metoduyla başlayın ve bir sonuç imleci döndürmeden önce seçimi, izdüşümü ve dizilim sıralaması kriter parametrelerini uygulayın.

  @Override
  public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sort) {
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
    qb.setTables(EARTHQUAKE_TABLE);
    switch (uriMatcher.match(uri)) {
      case QUAKE_ID: qb.appendWhere(KEY_ID + "=" + uri.getPathSegments().get(1));
                     break;
      default      : break;
    }
    String orderBy;
    if (TextUtils.isEmpty(sort)) {
      orderBy = KEY_DATE;
    } else {
      orderBy = sort;
    }
    Cursor c = qb.query(earthquakeDB,
                        projection,
                        selection, selectionArgs,
                        null, null, orderBy);
    c.setNotificationUri(getContext().getContentResolver(), uri);
    return c;
  }

8.    İçerik eklemek, silmek ve güncellemek için metodları gerçekleyin. Bu durumda, süreç içerik sağlayıcı işlem isteklerini veritabanındaki eşdeğerlerine eşlemek için bir egzersiz.

  @Override
  public Uri insert(Uri _uri, ContentValues _initialValues) {
    long rowID = earthquakeDB.insert(EARTHQUAKE_TABLE, "quake", _initialValues);
    if (rowID > 0) {
      Uri uri = ContentUris.withAppendedId(CONTENT_URI, rowID);
      getContext().getContentResolver().notifyChange(uri, null);
      return uri;
    }
    throw new SQLException("Failed to insert row into " + _uri);
  }
  @Override
  public int delete(Uri uri, String where, String[] whereArgs) {
    int count;
    switch (uriMatcher.match(uri)) {
      case QUAKES:
        count = earthquakeDB.delete(EARTHQUAKE_TABLE, where, whereArgs);
        break;
      case QUAKE_ID:
        String segment = uri.getPathSegments().get(1);
        count = earthquakeDB.delete(EARTHQUAKE_TABLE, KEY_ID + "="
                                    + segment
                                    + (!TextUtils.isEmpty(where) ? " AND ("
                                    + where + ')' : ""), whereArgs);
        break;

      default: throw new IllegalArgumentException("Unsupported URI: " + uri);
    }
    getContext().getContentResolver().notifyChange(uri, null);
    return count;
  }
  @Override
  public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
    int count;
    switch (uriMatcher.match(uri)) {
      case QUAKES: count = earthquakeDB.update(EARTHQUAKE_TABLE, values, where, whereArgs);
                   break;
      case QUAKE_ID: String segment = uri.getPathSegments().get(1);
                     count = earthquakeDB.update(EARTHQUAKE_TABLE, values, KEY_ID
                             + "=" + segment
                             + (!TextUtils.isEmpty(where) ? " AND ("
                             + where + ')' : ""), whereArgs);
                     break;
      default: throw new IllegalArgumentException("Unknown URI " + uri);
    }
    getContext().getContentResolver().notifyChange(uri, null);
    return count;
  }

9.    İçerik sağlayıcının tamamlanmasıyla, uygulama etiketi içinde yeni bir <provider> yaratarak onu manifestoya kayıt edin.


<provider android:name=".EarthquakeProvider" android:authorities="com.paad.provider.earthquake" />

Yorumlar

Bu blogdaki popüler yayınlar

Basit ve Dinamik Disk Nedir? Birbirine Nasıl Dönüştürülür?

Sabit diskler Windows 2000 işletim sistemine kadar sadece temel disk (basic disk) olarak ayarlanabiliyordu. Temel disk en fazla 4 birincil bölüm (primary partition) veya 3 primary ve 1 genişleyebilir bölüm (extended partition) şeklinde yapılandırılabilir. Bir temel diskte sadece 1 tane extended partition oluşturulabilir ve sadece primary partitionlara işletim sistemi kurulabilir. Windows 2000 ile gelen dinamik disk teknolojisi, Windows 2000 den sonraki tüm Windowssürümlerinde kullanılabilmektedir. Dinamik disk kavramıyla bölüm (partition) kavramı yerinihacim (volume) kavramına bırakmıştır. Dinamik disklerde, temel disklerde olduğu gibi bir sınırlama yoktur. İstenildiği kadar volume oluşturabilir, temel disk istenirse dinamik hale getirebilir ve bu işlem esnasında herhangi bir veri kaybı yaşanmaz. Fakat dinamik diskler temel diske çevirildiğinde bir veri kaybı söz konusu olacaktır. Temel diskin bilgileri kayıt defterinde tutulur. Dinamik diskin bilgileri kendi üstünde tutulur.

Einstein'in Rölativite Kuramına Bakış

Bu yüzyılın başlarında kuramsal fizikte altın çağ başladığı zaman, adı henüz bilim dünyasında duyulmamış bir fizikçi vardı. Bu, Annalen der Physık’in 1905 tarihli sayısında fotoelektrik olayı, Brown hareketi ve özel görelilikle ilgili ünlü üç çalışmasını birden yayınlayarak üne kavuşan Albert Einstein’dır. Onun fizikteki hayat boyu çalışmaları bilimin felsefesi ve yöntemleri üzerinde büyük etki yaptı. Einstein’ın kendisi bilimci filozoftu. Bu yüzyılın başlarında kuramsal fizikte altın çağ başladığı zaman, adı henüz bilim dünyasında duyulmamış bir fizikçi vardı. Bu, Annalen der Physık’in 1905 tarihli sayısında fotoelektrik olayı, Brown hareketi ve özel görelilikle ilgili ünlü üç çalışmasını birden yayınlayarak üne kavuşan Albert Einstein’dır. Onun fizikteki hayat boyu çalışmaları bilimin felsefesi ve yöntemleri üzerinde büyük etki yaptı. Einstein’ın kendisi bilimci filozoftu. O, hayranlık uyandırıcı bir şekilde felsefeyi kullanarak bugün modern bilimin önemli bir kısmı olan buluşlarını

Rubik Küp Nasıl Çözülür?

Rubik küp 3x3x3 veya 4x4x4 gibi karesel formatta ve her kenarı farklı renkte olan bir küptür. Bu küpün; sabır küpü, sinir küpü, zekâ küpü, renk küpü, Rubikin küpü, sihirli küp (magic box), 3d Puzzle, gibi birçok değişik adı vardır. Unutulmamalıdır ki küpün çözümü için geliştirilmiş bir algoritma vardır. Bu küp ezbere çözülemez. Bu yazıda sizlere küpün en yaygın çözümü anlatılacaktır. Hata yaptığınız yerde hatayı düzeltmeye çalışmayın belirtilen algoritma çerçevesinde çözüme baştan başlayın. Hala küpü çözemediyseniz buradaki yazımızda belirtilen otomatik çözen programları deneyebilirsiniz. Öncelikle bilmeniz gerekenler: Küpün parçaları birbirinden bağımsız değildirler. Küpün orta noktası daima sabittir. Küpü ne kadar çevirirseniz çevirin değişmezler. Kırmızının karşısında daima turuncu, yeşilin karşısında mavi, sarının karşısında beyaz vardır. Bir küp, toplam 26 adet parçadan oluşmaktadır: 8 adet üç renkli köşe parçası, 12 adet iki renkli parça ve 6 adet de sabit tek ren