usando un botón siguiente para pasar filas SQLite vacías

y gracias de antemano por la ayuda. Soy nuevo en esto y me he encontrado con un problema. Mi aplicación toma la información ingresada por el usuario y la almacena en una base de datos SQLite. Pueden ver los registros, y hay un botón "Anterior" y "Siguiente" que ve el registro anterior o siguiente.

El problema que tengo es si el usuario elimina un registro. ¿Cómo omitiría las filas vacías? Aquí está mi código limpiado.

Clase auxiliar DBase.java

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class DBase {

public static final String KEY_ROWID = "_id";
public static final String KEY_1 = "a";
public static final String KEY_2 = "b";
public static final String KEY_3 = "c";
public static final String KEY_4 = "d";
public static final String KEY_5 = "e";
public static final String KEY_6 = "f";

private static final String DATABASE_NAME = "name";
private static final String DATABASE_TABLE = "table";
private static final int DATABASE_VERSION = 1;

private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;

private static class DbHelper extends SQLiteOpenHelper {

    public DbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID
                + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_1
                + " TEXT NOT NULL, " + KEY_2 + " TEXT NOT NULL, "
                + KEY_3 + " TEXT NOT NULL, " + KEY_4
                + " TEXT NOT NULL, " + KEY_5 + " TEXT NOT NULL, "
                + KEY_6 + " TEXT NOT NULL);");

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
        onCreate(db);

    }

}

public DBase(Context c) {
    ourContext = c;

}

public DBase open() throws SQLException {
    ourHelper = new DbHelper(ourContext);
    ourDatabase = ourHelper.getWritableDatabase();
    return this;
}

public void close() {
    ourHelper.close();
}

public long createEntry(String a, String b, String c,
        String d, String e, String f) {
    // TODO Auto-generated method stub
    ContentValues cv = new ContentValues();
    cv.put(KEY_1, a);
    cv.put(KEY_2, b);
    cv.put(KEY_3, c);
    cv.put(KEY_4, d);
    cv.put(KEY_5, e);
    cv.put(KEY_6, f);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);

}

public String[] getRec(long record) {
    // TODO Auto-generated method stub

    record = ContactView.record;

    String[] columns = new String[] { KEY_ROWID, KEY_1, KEY_2,
            KEY_3, KEY_4, KEY_5, KEY_6 };
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "="
            + record, null, null, null, null);
    if (c != null && c.moveToFirst()) {
        String r1 = c.getString(0);
        String r2 = c.getString(1);
        String r3 = c.getString(2);
        String r4 = c.getString(3);
        String r5 = c.getString(4);
        String r6 = c.getString(5);
        String r7 = c.getString(6);

        String[] rData = { r1, r2, r3, r4, r5,
                r6, r7 };

        return rData;

    }

    return null;
}

// Returns the last record in the database
public long lRec() {

    long lastRec = 0;
    String query = "SELECT ROWID from Table order by ROWID DESC limit 1";
    Cursor c = ourDatabase.rawQuery(query, null);
    if (c != null && c.moveToFirst()) {
        lastRec = c.getLong(0);
    }
    return lastRec;
}

public void deleteEntry(long lRow) {

    ourDatabase.delete(DATABASE_TABLE, KEY_ROWID + "=" + lRow, null);

}

}

Y aquí está la clase de visualización, ContactView.java

import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class ContactView extends Activity implements OnClickListener {

TextView etSQLva, etSQLvb, etSQLvc, etSQLvd, etSQLve,
        etSQLvf, etSQLvg;
Button bSQLvPrev, bSQLvAdd, bSQLvNext, bSQLvDelete;
static long record = 1;
static long lastRecord;
String[] rRec;
long[] nextRec;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.contactview);

    initialize();
    display();

}

@Override
public void onClick(View arg0) {
    // TODO Auto-generated method stub

    switch (arg0.getId()) {
    case R.id.bSQLvPrev:

        recordMinus();
        display();

        break;
    case R.id.bSQLvAdd:

        Intent i = new Intent("com.example.ADD");
        startActivity(i);

        break;
    case R.id.bSQLvNext:

        recordPlus();
        display();

        break;
    case R.id.bSQLvDelete:

        String dRow = etSQLva.getText().toString();
        long lRow = Long.parseLong(dRow);

        DBase db1 = new DBase(this);

        try {
            db1.open();
            db1.deleteEntry(lRow);
            db1.close();
        } catch (Exception e) {
            // TODO: handle exception
            String error = e.toString();
            Dialog d = new Dialog(this);
            d.setTitle("Cannot Delete");
            TextView tv = new TextView(this);
            tv.setText(error);
            d.setContentView(tv);
            d.show();
        }

        break;

    }
}

public void initialize() {

    etSQLva = (TextView) findViewById(R.id.etSQLva);
    etSQLvb = (TextView) findViewById(R.id.etSQLvb);
    etSQLvc = (TextView) findViewById(R.id.etSQLvc);
    etSQLvd = (TextView) findViewById(R.id.etSQLvd);
    etSQLve = (TextView) findViewById(R.id.etSQLve);
    etSQLvf = (TextView) findViewById(R.id.etSQLvf);
    etSQLvg = (TextView) findViewById(R.id.etSQLvg);

    bSQLvPrev = (Button) findViewById(R.id.bSQLvPrev);
    bSQLvAdd = (Button) findViewById(R.id.bSQLvAdd);
    bSQLvNext = (Button) findViewById(R.id.bSQLvNext);
    bSQLvDelete = (Button) findViewById(R.id.bSQLvDelete);

    bSQLvPrev.setOnClickListener(this);
    bSQLvAdd.setOnClickListener(this);
    bSQLvNext.setOnClickListener(this);
    bSQLvDelete.setOnClickListener(this);
}

public void display() {

    DBase db = new DBase(this);

    db.open();

    rRec = db.getRec(record);

    try {
        lastRecord = db.lRec();
    } catch (Exception e) {
        // TODO: handle exception

        String error = e.toString();
        Dialog d = new Dialog(this);
        d.setTitle("Cannot get last record");
        TextView tv = new TextView(this);
        tv.setText(error);
        d.setContentView(tv);
        d.show();
    }

    db.close();

    if (rRec != null) {
        etSQLva.setText(rRec[0]);
        etSQLvb.setText(rRec[1]);
        etSQLvc.setText(rRec[2]);
        etSQLvd.setText(rRec[3]);
        etSQLve.setText(rRec[4]);
        etSQLvf.setText(rRec[5]);
        etSQLvg.setText(rRec[6]);
    } else {

    }

}

public void recordPlus() {
    if (record < lastRecord) {
        record++;
    } else {
        record = 1;
    }
}

public void recordMinus() {
    if (record == 1) {
        record = lastRecord;
    } else {
        record--;
    }

}



// Menu code below
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    MenuInflater mi = getMenuInflater();
    mi.inflate(R.menu.popup, menu);
    return true;
}

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.mAdd:
        startActivity(new Intent("com.example.ADD"));
        return true;
    case R.id.mView:
        startActivity(new Intent("com.example.VIEW"));
        return true;
    case R.id.mAbout:
        startActivity(new Intent("com.example.ABOUT"));
        return true;

    }
    return false;
}
// Menu code end

}

¿Cómo hago para que muestre el siguiente registro no vacío cuando se presiona "siguiente"?

Nuevamente, cualquier ayuda será apreciada, gracias.

EDITAR: aquí está mi nuevo código de método recordPlus ().

    public void recordPlus() {
    if (record < lastRecord) {
        record++;
    } else {
        record = 1;
    }
    getData();

    do{
        if (record < lastRecord) {
            record++;
        } else {
            record = 1;
        }
        getData();

    }while (rRec == null);

}

y separé mi método display () que publico a continuación

    public void getData() {

    DBase db = new DBase(this);

    db.open();

    rRec = db.getRec(record);

    try {
        lastRecord = db.lRec();

    } catch (Exception e) {
        // TODO: handle exception

        String error = e.toString();
        Dialog d = new Dialog(this);
        d.setTitle("Cannot get last record");
        TextView tv = new TextView(this);
        tv.setText(error);
        d.setContentView(tv);
        d.show();
    }

    db.close();

}

public void display() {

    if (rRec != null) {
        etSQLva.setText(rRec[0]);
        etSQLvb.setText(rRec[1]);
        etSQLvc.setText(rRec[2]);
        etSQLvd.setText(rRec[3]);
        etSQLve.setText(rRec[4]);
        etSQLvf.setText(rRec[5]);
        etSQLvg.setText(rRec[6]);
    } else {

    }

}

preguntado el 08 de noviembre de 11 a las 17:11

1 Respuestas

En su método de visualización, solo tenga un código de verificación como este (tenga en cuenta que este es un código psuedo):

recordPlus(){
  Record currentRecord; 
  do{ 
    ++record;
    currentRecord = getRecord(record);
  }while(isEmptry(currentRecord) && record < lastRecord)
}

Harías algo similar para recordMinus.

respondido 08 nov., 11:22

el problema es que si el registro anterior o siguiente está vacío (eliminado) cuando el usuario presiona el botón anterior o siguiente, me gustaría que pasara al siguiente registro no vacío. - Bill Gary

Lo siento, entendí mal tu pregunta. Edité mi publicación. - Kurtis Nusbaum

Ok, conseguí que mi método recordPlus () funcionara omitiendo registros vacíos, pero ahora tengo otro problema. no se repite hasta el primer registro una vez que alcanzo el último registro como solía hacer jajaja. Editaré y agregaré el nuevo código arriba. Lo mismo sucede con el botón anterior. - Bill Gary

tal vez debería separar "lastRecord = db.lRec ();" en su propio método, ya que se llama cada vez que llamo a getData (). - Bill Gary

ok, separar lastRecord = db.lRec () de su propio método no funcionó. - Bill Gary

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.