Android - ¿Qué valor es devuelto por el método de conveniencia de inserción para una mesa SIN ROWID?

Mike:

Nota Esta cuestión está destinada a ser una cuota de sus conocimientos, Q & A-estilo .

SQLite por defecto crea una columna oculta a saber rowid que se le asigna un valor entero de 64 bits única.

Sin embargo, desde SQLite versión 3.8.2, SQLite ha apoyado el SIN ROWID cláusula, que da como resultado la rowid habiéndose omitido.

Lo que sería el resultado, suponiendo una inserción exitosa?

es decir, el largo de regresar de la SQLiteDatabase inserto familia (insertar, insertOrThrow y insertWithOnConflict) como por: -

el ID de fila de la fila recién insertada, o -1 si se produjo un error

SQLiteDatabase - inserto

Mike:

Como SQLite versión 3.8.2 o mayor sólo está disponible desde API 21 Lollilop, a continuación, SIN ROWID sólo se puede utilizar de API 21 en.

  • ( Advertencia Algunos fabricantes de dispositivos incluir diferentes versiones de SQLite en sus dispositivos. Android.database.sqlite )

Antes de API 21 codificación sin ROWID daría lugar a un error de sintaxis, por lo que un resultado no sería posible, ya que no puede existir una tabla de este tipo.

Desde API 21 entonces el resultado es que se devuelve 0, si el inserto trabajó más -1.

Sin embargo, que sólo está suponiendo un caso simple de una sola tabla o múltiple sin tablas ROWID (es decir, no hay mesas ROWID).

Añadir tablas ROWID en la mezcla, lo que sería el escenario más probable, entonces el resultado es como por el tiempo anterior, desde que se abrió la base de datos, que un resultado se estableció (como por SQLite en lugar de la SDK Android) o -1.

En resumen, el valor si no -1, indica que se insertó una fila (muy probable), -1 típicamente indicar que la fila no se ha insertado.

  • advertencia si se fuerza una rowid sea -1 (suministro de -1 para la columna rowid directamente o mediante un alias) a continuación, un resultado de -1 podría ser devuelto, a pesar de que la fila se insertó.

Ejemplo

Lo siguiente demuestra la creación de una base de datos con una sola sin la tabla ROWID, en el que se insertan dos filas y el resultado es la salida en el registro. Una subclase de SQLiteOpenHelper se utiliza como esto parece ser el medio más comunes de acceso de base de datos SQLite.

DBHelperNoRowid.java (Base de datos ayudante)

public class DBHelperNoRowid extends SQLiteOpenHelper {

    public final static String DB = "test_norowid";
    public static final int VERSION = 1;
    public static final String TBL_NOROWID = "norowid";
    public static final String COL_ID = BaseColumns._ID;
    public static final String COL_MYDATA = "mydata";

    SQLiteDatabase mDB;

    public DBHelperNoRowid(Context context) {
        super(context, DB, null, VERSION);
        mDB = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String crt_norowid_table = "CREATE TABLE IF NOT EXISTS " + TBL_NOROWID + "(" +
                COL_ID + " INTEGER PRIMARY KEY, " +
                COL_MYDATA + " TEXT" +
                ") WITHOUT ROWID"; //<<<<<<<<<<
        db.execSQL(crt_norowid_table);
    }

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

    }

    public long insertUsingConvenienceInsert(long not_an_id, String text) {
        ContentValues cv = new ContentValues();
        cv.put(COL_ID,not_an_id);
        cv.put(COL_MYDATA,text);
        return mDB.insert(TBL_NOROWID,null,cv);
    }
}

MainActivty.java

public class MainActivity extends AppCompatActivity {

    DBHelperNoRowid mDBhlpr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDBhlpr = new DBHelperNoRowid(this);
        logInsertResult(2100L,"row 1");
        logInsertResult(-898765432,"row 2");
    }

    private void logInsertResult(long not_an_id, String text) {

        Log.d("INSERTRESULT","Insertion of a row returned " + String.valueOf(
                mDBhlpr.insertUsingConvenienceInsert(not_an_id,text)
        ));
    }
}

Resultado

2019-01-23 17:36:04.029 24175-24175/so.uru D/INSERTRESULT: Insertion of a row returned 0
2019-01-23 17:36:04.029 24175-24175/so.uru D/INSERTRESULT: Insertion of a row returned 0

segunda pasada

Ejecución de la anterior resultará en el conflicto restricción UNIQUE, que será atrapado por el inserto de método, y luego -1 será devuelto por ejemplo: -

2019-01-23 19:49:51.915 24876-24876/so.uru E/SQLiteDatabase: Error inserting _id=2100 mydata=row 1
    android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: norowid._id (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY)
        at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
        at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:796)
        at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
        at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1564)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1433)
        at so.uru.DBHelperNoRowid.insertUsingConvenienceInsert(DBHelperNoRowid.java:42)
        at so.uru.MainActivity.logInsertResult(MainActivity.java:23)
        at so.uru.MainActivity.onCreate(MainActivity.java:16)
        at android.app.Activity.performCreate(Activity.java:7136)
        at android.app.Activity.performCreate(Activity.java:7127)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2019-01-23 19:49:51.916 24876-24876/so.uru D/INSERTRESULT: Insertion of a row returned -1
2019-01-23 19:49:51.918 24876-24876/so.uru E/SQLiteDatabase: Error inserting _id=-898765432 mydata=row 2
    android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: norowid._id (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY)
        at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
        at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:796)
        at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
        at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1564)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1433)
        at so.uru.DBHelperNoRowid.insertUsingConvenienceInsert(DBHelperNoRowid.java:42)
        at so.uru.MainActivity.logInsertResult(MainActivity.java:23)
        at so.uru.MainActivity.onCreate(MainActivity.java:17)
        at android.app.Activity.performCreate(Activity.java:7136)
        at android.app.Activity.performCreate(Activity.java:7127)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2019-01-23 19:49:51.918 24876-24876/so.uru D/INSERTRESULT: Insertion of a row returned -1

Código utilizado para probar una mezcla de rowid y sin tablas

  • Tenga en cuenta lo siguiente es sólo una de las múltiples permutaciones utilizados para las pruebas: -

DBHelperBoRowid.java

public class DBHelperNoRowid extends SQLiteOpenHelper {

    public final static String DB = "test_norowid";
    public static final int VERSION = 1;
    public static final String TBL_NOROWID = "norowid";
    public static final String COL_ID = BaseColumns._ID;
    public static final String COL_MYDATA = "mydata";
    public static final String TBL_WITHROWID = "withrowid";

    SQLiteDatabase mDB;

    public DBHelperNoRowid(Context context) {
        super(context, DB, null, VERSION);
        mDB = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String crt_norowid_table = "CREATE TABLE IF NOT EXISTS " + TBL_NOROWID + "(" +
                COL_ID + " INTEGER PRIMARY KEY, " +
                COL_MYDATA + " TEXT" +
                ") WITHOUT ROWID";
        db.execSQL(crt_norowid_table);
        String crt_withrowid_table = "CREATE TABLE IF NOT EXISTS " + TBL_WITHROWID + "(" +
                COL_ID + " INTEGER PRIMARY KEY, " +
                COL_MYDATA + " TEXT" +
                ")";
        db.execSQL(crt_withrowid_table);
    }

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

    }

    public long insertUsingConvenienceInsert(long not_an_id, String text, boolean without_rowid, boolean generate_rowid) {
        ContentValues cv = new ContentValues();
        String table = TBL_WITHROWID;
        if (without_rowid) {
            table = TBL_NOROWID;
            cv.put(COL_ID,not_an_id);
        } else {
            if (generate_rowid) {
                cv.put(COL_ID,not_an_id);
            }
        }
        cv.put(COL_MYDATA,text);
        return mDB.insert(table,null,cv);
    }

    public void logLastInsertId() {
        Cursor csr = mDB.rawQuery("SELECT last_insert_rowid()",null);
        if (csr.moveToFirst()) {
            Log.d("LASTINSERTEDROWID","The Last RowID inserted was " + String.valueOf(csr.getLong(0)));
        } else {
            Log.d("LASTINSERTEDROWID","Ooops there does not appear to have been a row inserted");
        }
    }
}

MainActivity.java (según la última permutación utiliza)

public class MainActivity extends AppCompatActivity {

    DBHelperNoRowid mDBhlpr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDBhlpr = new DBHelperNoRowid(this);
        // Insert some rows into the table that is a rowid table
        logInsertResult(1,"row 1",false,false);
        logInsertResult(1,"row 1",false,false);
        logInsertResult(1,"row 1",false,false);
        logInsertResult(1,"row 1",false,false);
        logInsertResult(-1,"row 1",false,true);

        logInsertResult(2100L,"row 1",true,true); //<<<<<<<<<< WITHOUT

        logInsertResult(1,"row 1",false,false);
        logInsertResult(1,"row 1",false,false);
        logInsertResult(1,"row 1",false,false);

        logInsertResult(-898765432,"row 2",true,true); //<<<<<<<<<< WITHOUT

        logInsertResult(1,"row 1",false,false);
        logInsertResult(1,"row 1",false,false);
        logInsertResult(1,"row 1",false,false);
        logInsertResult(1,"row 1",false,false);

        logInsertResult(-1L,"3rd row",true,true); //<<<<<<<<<< WITHOUT
    }

    private void logInsertResult(long no_an_id, String text, boolean without_rowid, boolean generate_rowid) {

        if (without_rowid) {
            Log.d("INSERTRESULT",">>>>>>>>>> WITHOUT ROWID ATTEMPT");
        }

        Log.d("INSERTRESULT","Insertion of a row returned " + String.valueOf(
                mDBhlpr.insertUsingConvenienceInsert(no_an_id,text,without_rowid,generate_rowid)
        ));
        mDBhlpr.logLastInsertId(); //
    }
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=211638&siteId=1
Recomendado
Clasificación