Запрос к базе данных Android не работает должным образом

1

Я создал базу данных с такой информацией, как http://i170.photobucket.com/albums/u244/therealbbri06/database.jpg

и я пытаюсь получить имя_группы из базы данных, используя это

public String readNameFromPosition(int position) {
    Cursor c;
    c = myDataBase.query("hikingGroups", new String[] { "groupName" },
            "position=\'" + position + "\'", null, null, null, null);
    if (c.moveToFirst()) {
        return c.getString(0);
    } else {
        return "" + c.getCount();
    }
}

Когда position = 0, имя_группы правильно извлекается, но всякий раз, когда позиция равна любому другому действительному числу, c.getCount() возвращает "0". Любая помощь? Я могу отправить больше кода, если нужно, просто спросите. Также readNameFromPosition() находится внутри моего класса DataBaseHelper.

UPDATE: мой код

package bry.Bicker.OjaiHiking;
import java.io.IOException;
import android.app.Activity;
import android.database.SQLException;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Gallery;
import android.widget.TextView;
import android.widget.Toast;

public class OjaiHikingActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    final DataBaseHelper theDb = new DataBaseHelper(getApplicationContext());
    try {

        theDb.createDataBase();

    } catch (IOException ioe) {

        throw new Error("Unable to create database");

    }

    try {

        theDb.openDataBase();

    } catch (SQLException sqle) {

        throw sqle;

    }
    final Gallery hikesGallery = (Gallery) findViewById(R.id.gallery1);
    hikesGallery.setAdapter(new ImageAdapter(this));
    hikesGallery.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,
                int arg2, long arg3) {
            String groupName = "";
            int position = hikesGallery.getSelectedItemPosition();
            Toast.makeText(getApplicationContext(), "" + position,
                    Toast.LENGTH_SHORT).show();
            groupName = theDb.readNameFromPosition(position);
            TextView tV = (TextView) findViewById(R.id.groupName);
            Typeface font = Typeface.createFromAsset(getAssets(),
                    "arialbd.ttf");
            tV.setTypeface(font);
            tV.setText(groupName);
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
        }

    });
    hikesGallery.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView parent, View v, int position,
                long id) {

        }
    });
}
}

Код для DataBaseHelper.java

package bry.Bicker.OjaiHiking;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class DataBaseHelper extends SQLiteOpenHelper {

// The Android default system path of your application database.
private static String DB_PATH = "/data/data/bry.Bicker.OjaiHiking/databases/";

private static String DB_NAME = "Ojaiker.db";

private SQLiteDatabase myDataBase;

private final Context myContext;

public DataBaseHelper(Context context) {

    super(context, DB_NAME, null, 1);
    this.myContext = context;
}

public void createDataBase() throws IOException {

    boolean dbExist = checkDataBase();

    if (dbExist) {
        // do nothing - database already exist
    } else {

        this.getReadableDatabase();

        try {

            copyDataBase();

        } catch (IOException e) {

            throw new Error("Error copying database");

        }
    }

}

/**
 * Check if the database already exist to avoid re-copying the file each
 * time you open the application.
 * 
 * @return true if it exists, false if it doesn't
 */
private boolean checkDataBase() {

    SQLiteDatabase checkDB = null;

    try {
        String myPath = DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READONLY);

    } catch (SQLiteException e) {

        // database does't exist yet.

    }

    if (checkDB != null) {

        checkDB.close();

    }

    return checkDB != null ? true : false;
}

/**
 * Copies your database from your local assets-folder to the just created
 * empty database in the system folder, from where it can be accessed and
 * handled. This is done by transfering bytestream.
 * */
private void copyDataBase() throws IOException {

    // Open your local db as the input stream
    InputStream myInput = myContext.getAssets().open(DB_NAME);

    // Path to the just created empty db
    String outFileName = DB_PATH + DB_NAME;

    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    // transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }

    // Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();

}

public void openDataBase() throws SQLException {

    // Open the database
    String myPath = DB_PATH + DB_NAME;
    myDataBase = SQLiteDatabase.openDatabase(myPath, null,
            SQLiteDatabase.OPEN_READONLY);

}

@Override
public synchronized void close() {

    if (myDataBase != null)
        myDataBase.close();

    super.close();

}

public String readNameFromPosition(int position) {
    Cursor c;
    c = myDataBase.query("hikingGroups", new String[] { "groupName" },
            "position=\'" + position + "\'", null, null, null, null);
    if (c.moveToFirst()) {
        return c.getString(0);
    } else {
        return "" + c.getCount();
    }
}

@Override
public void onCreate(SQLiteDatabase db) {

}

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

}
  • 0
    Вы открыли базу данных перед выполнением запроса?
  • 0
    Я так считаю. Я собираюсь опубликовать весь мой код, потому что кажется, что пока ничего не помогло.
Теги:
database
sqlite3

3 ответа

1
Лучший ответ

Вы уверены, что не обновили базу данных со значениями вне приложения (например, в менеджере SQLite), а затем запустите приложение, предполагая, что новые значения будут присутствовать в новом прогоне? Ваша база данных не будет построена снова с новыми значениями, как она есть на устройстве/эмуляторе.

Попробуйте переустановить приложение и затем снова его установите (дикая догадка заключается в том, что вы сначала запустили базу данных только с одним значением (для позиции 0)).

  • 0
    Ах, хм. Ну, ты прав. Я сначала запустил его только с одним значением. Я удалил свой эмулятор и сделал новый. Теперь он работает: D Есть ли другой способ переустановить приложение без необходимости удалять и заново создавать мой эмулятор? Я думал, что он переустанавливался каждый раз, когда запускалась программа, но, думаю, я ошибался.
  • 1
    @BrianEcker Вам не нужно удалять и воссоздавать свой эмулятор, как и в любом приложении, перейдите в « Settings -> « Applications -> « Manage Applications -> « Your app и там - « Clear data и Uninstall . Вам не нужно закрывать эмулятор или что-то еще.
Показать ещё 3 комментария
0

Я думаю, что запрос БД не возвращает никакого результата. c.moveToFirst() должен возвращать false и, следовательно, вы не должны делать c.getString(...)

Лучшая обработка

if (c.moveToFirst()) {
    return c.getString(c.getColumnIndex(KEY_GROPUNAME));
} else {
    return "" + c.getCount();
}
0
public String readNameFromPosition(int position) {
Cursor c;
public static final String KEY_ROWID="id";
public static final String KEY_POSITION="position";
public static final String KEY_GROPUNAME="groupName";
String[] col=new String[]{KEY_ROWID,KEY_POSITION,KEY_GROPUNAME};
Cursor c=ourDatabase.query("hikingGroups", col,KEY_POSITION+"="+position, null, null, null, null);

if (c!=null) {
     c.moveToFirst();

    return c.getString(c.getColumnIndex(KEY_GROPUNAME));
} else {
    return "" + c.getCount();
}

}

попробуйте этот путь

  • 0
    Android вылетает. Logcat: android.database.CursorIndexOutOfBoundsException: индекс 0 запрошен, с размером 0 Так что мне кажется, что запрос все еще не получает данные.
  • 0
    У @BrianEcker есть замена в строке курсора, где наша база данных по имени базы данных определяется как AS в вашем классе SQLiteDatabase наша база данных. Я также отредактировал проверку моего ответа и позвольте мне сообщить
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню