SqliteDiffAndroidApi

Temel Konsept

Kütüphanenin amacı uygulama içerisinde kullanılacak olan veritabanlarının indirilmesi ve bu veritabanlarının güncel tutulmasıdır. Kütüphane SqliteDiffWebService ile iletişim halinde çalışmaktadır. Kullanılmak istenen veritabanı eğer cihaz hiç bulunmuyor ise veritabanı sıfırdan indirilir, eğer veritabanı mevcut ise webservice üzerinden mevcut sürüm ve güncel sürüm arasındaki farkları alarak veritabanının güncellenmesi sağlanır, güncel veritabanı tamamen indirilmez. Bu işlemleri sağlayan method geliştirici tarafından çağırılmalıdır.

1. Minimum Sdk Versiyon

  • Android version 4.0 (android:minSdkVersion="15")

2. Kütüphanenin Eklenmesi

  • Öncelikle sqliteDiff’in kullanılabilmesi için başarsofttan artifactory kullanıcı adı ve şifresi alınmalıdır. Ardından bu kullanıcı adı ve şifre “gradle.properties” dosyasına aşağıdaki gibi eklenmelidir.
    mavenUser=username
    mavenPassword=pass
  • build.gradle(Project: projectName)
    apply plugin: "com.basarsoft.gradle.basarArtifactory"
    buildscript {
        dependencies {
            classpath 'com.basarsoft.gradle:artifactory-all:4.1.1'
        }
    }
  • build.gradle(Module: app)
    Not: Android Support kütüphanesi kullanılan projelerde 1.0.10 sqlitediff sürümü son sürümdür. Sonraki güncellemelerin çalışması için AndroidX’e geçmeniz gerekmektedir.
    dependencies {
        implementation ('com.basarsoft.api:sqlitediff:1.1.1') {
            exclude module: 'jsqlite'
        }
    }
  • Projenin AndroidManifest.xml dosyasına aşağıdaki izinler eklenir. Projenin sürümüne bağlı olarak runtimePermission’da kullanılmalıdır.
      <uses-permission android:name="android.permission.INTERNET"/>
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    

3. SqliteItem Objesinin Oluşturulması

    String dbPath; // ex: Environment.getExternalStorageDirectory().getAbsolutePath()+"/yolbildata"
    String dbName; //without extension
    String webServiceUrl; // ex: http://10.100.20.18:8080/checkAndUpdateSqlite
    SqliteItem sqliteItem = new SqliteItem(dbPath, dbName, webServiceUrl);

4. SqliteDiff Objesinin Oluşturulması

    public class SqliteDiffAPITest extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            SqliteDiff sqliteDiff = new SqliteDiff(getApplicationContext());
        }
    }

DiffProgressListener güncellenen veya indirilen sqliteItem objesinin hangi state’de olduğunu dinlemek için kullanılır, mecburi değildir.

     DiffProgressListener diffProgressListener = new DiffProgressListener() {
            @Override
            public void progress(SqliteItem sqliteItem, int percentage, DiffState diffState) {
                Log.e("onProgress", "sqliteItemName " + sqliteItem.getName() + " percentage " + String.valueOf(percentage) + " diffState " + diffState.getNumVal());
            }

            @Override
            public void onTransaction(SqliteItem sqliteItem, int percentage, String filename) {
                Log.e("onTransaction", "sqliteItemName " + sqliteItem.getName() + " percentage " + String.valueOf(percentage) + " filename " + filename);
            }

            @Override
            public void onQueryCompleted(SqliteItem sqliteItem, int queryNumber, String fileName) {
                Log.e("onQueryCompleted", "sqliteItemName " + sqliteItem.getName() + " percentage " + String.valueOf(queryNumber) + " filename " + fileName);
            }

            @Override
            public void completed(SqliteItem sqliteItem) {
                Log.e("completed", "sqliteItemName " + sqliteItem.getName());
            }

            @Override
            public void error(SqliteItem sqliteItem, ErrorType errorType) {
                Log.e("error", "sqliteItemName " + sqliteItem.getName());

                // SpatialIndex hatası olması halinde bazı veriler haritada gösterilmeyecektir
                if (errorType?.equals(ErrorType.SPATIAL_INDEX_ERROR) == true) {
                    // Bu metot çağırılarak SpatialIndex hatalarının düzeltilmesi sağlanır. Bu işlem 15sn - 60sn arasında sürebilmektedir.
                    sqliteDiff?.repairSpatialIndex(sqliteItem)
                    return
                }
            }
        };
    SqliteDiff sqliteDiff = new SqliteDiff(getApplicationContext(),diffProgressListener);

5. SqliteItem Objesinin İndirilmesi/Güncellenmesi

  • Kütüphane yapısına göre diffSqliteItem veya diffAllSqliteItems methodları çağırılmadıkça güncelleme veya indirme işlemleri yapılmayacaktır, kullanım aşağıdaki gibi olmalıdır.
    SqliteItem sqliteItem = new SqliteItem(dbPath,dbName,webServiceUrl);
    SqliteDiff sqliteDiff = new SqliteDiff(getApplicationContext());
    sqliteDiff.diffSqliteItem(sqliteItem); //kontrolü sağlar, indirme işlemini veya güncelleme işlemini yapar
  • SqliteItem objesi güncellenmek için veya aynı anda birden fazla sqliteItem objesinin kontrolünü sağlamak için aşağıdaki gibi kullanılabilir. Oluşturulmuş bir sqliteDiff objesine veritabanları eklendikten sonra istenildiği zaman ve istenildiği kere diffAllSqliteItems methodu çağırılabilir, tekrar veritabanlarının eklenmesine gerek yoktur.
    SqliteItem sqliteItem = new SqliteItem(dbPath,dbName,webServiceUrl);
    SqliteItem sqliteItem2 = new SqliteItem(dbPath2,dbName2,webServiceUrl2);
    SqliteDiff sqliteDiff = new SqliteDiff(getApplicationContext());
    sqliteDiff.addSqliteItem(sqliteItem); 
    sqliteDiff.addSqliteItem(sqliteItem2); 
    sqliteDiff.diffAllSqliteItems();