SQLite Сравнение таблиц в Android - PullRequest
0 голосов
/ 13 января 2020

Есть ли какой-нибудь метод для сравнения таблиц (с одинаковыми свойствами, конечно) и возврата true, если они одинаковы, и false, если нет? Спасибо.

Ответы [ 2 ]

1 голос
/ 13 января 2020

Не напрямую, но реально просто.

То есть sqlite хранит SQL, используемый для определения таблиц в таблице sqlite_master (схема).

Для простейшего сравнения SQL до SQL (для определений столбцов), затем вы можете использовать следующие SQL: -

WITH tablenames(table1,table2) AS (SELECT 'table1' /*<<<<< change accordingly */,'table2' /*<<<<< change accordingly*/)
SELECT 
    COALESCE(
        (SELECT substr(sql,instr(sql,'(')) FROM sqlite_master WHERE name = (SELECT table1 FROM tablenames)) =
        (SELECT substr(sql,instr(sql,'(')) FROM sqlite_master WHERE name = (SELECT table2 FROM tablenames))
    ,0)
;

В Android это можно сделать с помощью (в помощнике по базе данных): -

public boolean compareTable(String table1, String table2) {
    SQLiteDatabase db = this.getWritableDatabase();
    String result_column = "result";
    boolean rv = false;
    Cursor csr = db.rawQuery("WITH tablenames(table1,table2) AS (SELECT ? ,? )" +
            "SELECT " +
            "COALESCE(" +
            "(SELECT substr(sql,instr(sql,'(')) FROM sqlite_master WHERE name = (SELECT table1 FROM tablenames)) =" +
            "(SELECT substr(sql,instr(sql,'(')) FROM sqlite_master WHERE name = (SELECT table2 FROM tablenames))" +
            ",0) " +
            "AS " + result_column +
            ";",new String[]{table1,table2});
    if (csr.moveToFirst()) {
        rv = (csr.getInt(csr.getColumnIndex(result_column)) > 0);
    }
    csr.close();
    return rv;
}
  • Обратите внимание, что малейшая разница в SQL будет считаться неудачной при сравнении

Пример

Помощник по базам данных DatabaseHelper . java

public class DatabaseHelper extends SQLiteOpenHelper {
    public static final String DBNAME = "mydb";
    public static final int DBVERSION = 1;

    public static final String TABLE = "htmlstore";
    public static final String IDCOLUMN = BaseColumns._ID;
    public static final String HTMLCOLUMN = "html";

    public static final String TABLE2 = "otherstore";
    public static final String TABLE3 = "storeother";

    SQLiteDatabase db;

    public DatabaseHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
        db = this.getWritableDatabase();

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String crt_htmlstore_table = "CREATE TABLE IF NOT EXISTS " + TABLE + "(" +
                IDCOLUMN + " INTEGER PRIMARY KEY," +
                HTMLCOLUMN + " TEXT" +
                ")";
        db.execSQL(crt_htmlstore_table);
        String crt_otherstore_table = "CREATE TABLE IF NOT EXISTS " + TABLE2 + "(" +
                IDCOLUMN + " INTEGER PRIMARY KEY," +
                HTMLCOLUMN + " TEXT" +
                ")";
        db.execSQL(crt_otherstore_table);
        String crt_storeother_table = "CREATE TABLE IF NOT EXISTS " + TABLE3 + "(" +
                HTMLCOLUMN + " TEXT, " +
                IDCOLUMN + " INTEGER, " +
                " PRIMARY KEY(" + IDCOLUMN + ")" +
                ")";
        db.execSQL(crt_storeother_table);
    }


    public long insert(String html) {
        ContentValues cv = new ContentValues();
        cv.put(HTMLCOLUMN,html);
        return db.insert(TABLE,null,cv);
    }

    public String getHTML(long id) {
        String rv = "";
        Cursor csr = db.query(TABLE,new String[]{HTMLCOLUMN},IDCOLUMN+"=?",new String[]{String.valueOf(id)},null,null,null);
        if (csr.moveToFirst()) {
            rv = csr.getString(csr.getColumnIndex(HTMLCOLUMN));
        }
        csr.close();
        return rv;
    }

    public boolean compareTable(String table1, String table2) {
        SQLiteDatabase db = this.getWritableDatabase();
        String result_column = "result";
        boolean rv = false;
        Cursor csr = db.rawQuery("WITH tablenames(table1,table2) AS (SELECT ? ,? )" +
                "SELECT " +
                "COALESCE(" +
                "(SELECT substr(sql,instr(sql,'(')) FROM sqlite_master WHERE name = (SELECT table1 FROM tablenames)) =" +
                "(SELECT substr(sql,instr(sql,'(')) FROM sqlite_master WHERE name = (SELECT table2 FROM tablenames))" +
                ",0) " +
                "AS " + result_column +
                ";",new String[]{table1,table2});
        if (csr.moveToFirst()) {
            rv = (csr.getInt(csr.getColumnIndex(result_column)) > 0);
        }
        csr.close();
        return rv;
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
  • Обратите внимание, что фактически все 3 таблицы одинаковы ( НО 3-я таблица отличается используемым SQL для генерации определений столбцов и, таким образом, будет считаться другим)

  • COALESCE используется для преобразования нулевого значения (таких таблиц в sqlite_master нет) в 0 (false)

Код вызова MainActivity. java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DatabaseHelper databaseHelper = new DatabaseHelper(this);

        Log.d("TABLECOMPARE"," Result = " + String.valueOf(databaseHelper.compareTable(DatabaseHelper.TABLE,DatabaseHelper.TABLE2)));
        Log.d("TABLECOMPARE"," Result = " + String.valueOf(databaseHelper.compareTable(DatabaseHelper.TABLE2,DatabaseHelper.TABLE3)));
        Log.d("TABLECOMPARE"," Result = " + String.valueOf(databaseHelper.compareTable(DatabaseHelper.TABLE,DatabaseHelper.TABLE3)));
        Log.d("TABLECOMPARE"," Result = " + String.valueOf(databaseHelper.compareTable(DatabaseHelper.TABLE,DatabaseHelper.TABLE)));
    }
}

Res ult: -

2020-01-14 07:23:29.624 D/TABLECOMPARE:  Result = true
2020-01-14 07:23:29.625 D/TABLECOMPARE:  Result = false
2020-01-14 07:23:29.625 D/TABLECOMPARE:  Result = false
2020-01-14 07:23:29.626 D/TABLECOMPARE:  Result = true

т.е.

  • Таблицы1 и Таблицы2 считаются одинаковыми
  • Таблицы2 и Таблицы3 считаются разными
  • Таблицы1 и Таблицы3 считаются различными
  • Таблица 1 считается такой же, как таблица 1.
0 голосов
/ 13 января 2020

Вы можете достичь этого с помощью SQL запросов. Есть много способов сделать это

Например this

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...