2010-06-26 14 views
7

Al insertar una fila en una base de datos de búsqueda de texto declarada como:SQLiteDatabase.insert() devuelve rowid incorrecto para tablas virtuales

CREATE VIRTUAL TABLE foo USING fts3 (bar); 

el método SQLiteDatabase.insert() devuelve un rowid incorrecta. Si la tabla se declara como:

CREATE TABLE foo (bar VARCHAR(10)); 

devuelve el valor rowid correcto. El problema es cuando consulto la base de datos poco después de insertar usando rowid devuelto por el método, el Cursor devuelto no tiene registros. Funciona correctamente para la primera inserción en la base de datos solamente. Para inserciones posteriores, se devuelve un rowid incorrecto.

¿Hay algo que tenga que hacer para obtener el rowid correcto del método SQLiteDatabase.insert()?

Estoy usando Android SDK versión 2.1update1.

Gracias, Dan

Actualización: Terminé usando un truco para conseguir la última fila Identificación usando el siguiente código:

private int getLastRowId(SQLiteDatabase db, String table) { 
    Cursor cursor = null; 
    try { 
     cursor = db 
       .rawQuery(String.format(Locale.US, "SELECT MAX(rowid) FROM %s", table), null); 
     if (cursor.moveToFirst()) { 
      return cursor.getInt(0); 
     } else { 
      return 0; 
     } 
    } finally { 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 
} 

En mi caso, es seguro, ya que sólo un único usuario tiene acceso a la aplicación. Para las aplicaciones de servicio, esto puede no funcionar dependiendo de cómo se implemente/use.

Creo que tenemos este problema porque al realizar una inserción en tablas fts3, se inserta más de una fila. También se inserta una fila en la tabla de materias y en las tablas de administración de fts3.

+1

¿Seguro que Android admite 'USING fts'? Lo último que supe es que eso no formaba parte de la compilación de SQLite de Android. No he oído nada al respecto en los últimos lanzamientos, así que tal vez lo agregaron, pero creo que lo habrían mencionado. – CommonsWare

Respuesta

1

De SQLite Full-Text Search:

Su tabla debe contener campo de texto al menos 1 .

PD: +1: No sabía de Virtual Tables. Gracias.

+1

En SQLite, todas las columnas FTS3 son de tipo TEXTO. Las especificaciones de tipo para las columnas se ignoran (http://www.sqlite.org/fts3.html#section_1_1). FTS3 es una implementación de tablas virtuales. – Dan

+0

@ user376859: Oh, buen punto. ¿Revisaste el código de muestra del enlace? – Macarse

Cuestiones relacionadas