База данных SQLite для Android Приложение для локальных рекордов.Как открыть все данные, а затем перезаписать все данные? - PullRequest
1 голос
/ 08 января 2012

Я нашел много примеров о SQlite.У меня нет опыта работы с этим языком, но Android рекомендует использовать эту базу данных для локального сохранения.Я просто не могу решить эту проблему.У меня есть следующее (адаптировано из примера):

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper
{

    public static final String DATABASE_NAME = "highscores";

    public DatabaseHelper(Context context)
    {
        super(context, DATABASE_NAME, null, 1);
    }                       // I don't even need this, do I? ...

    @Override
    public void onCreate(SQLiteDatabase db)
    {

    String sql = "CREATE TABLE IF NOT EXISTS scoretable (" +
                    "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
                    "Curscore INTEGER, " +
                    "Curmode INTEGER, " +
                    "Curdiff INTEGER, " +
                    "Curdate STRING);";
    db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        //Not used
    }
}

В своей (основной) деятельности у меня есть:

protected SQLiteDatabase db;
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    // Other code
    db = (new DatabaseHelper(this)).getWritableDatabase();
}

Для вставки данных, которые я использую:

    String dateFormat = "dd/MM";
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
    String date = sdf.format(cal.getTime());

    ContentValues values = new ContentValues();
    values.put("Curscore", score);     // score is a public integer
    values.put("Curmode", gamemode);   // gamemode is a public integer
    values.put("Curdiff", difficulty); // difficulty is a public integer
    values.put("Curdate", date);
    db.insert("scoretable", null, values);

ВОПРОС: Единственное, что мне сейчас нужно, - это функция, которая извлекает все данные из «таблицы результатов».Затем я буду манипулировать им (я сравниваю баллы и вставляю новый балл, если он достаточно высок, я сам смогу позаботиться об этом).После этого я хочу перезаписать старые данные новыми обработанными данными.(10-1) Почему мой текущий код не работает?

Заранее спасибо !!

Ответы [ 2 ]

2 голосов
/ 08 января 2012

Вы должны использовать метод query() класса SQLiteDatabase для извлечения всех строк из таблицы рекордов, это даст вам Cursor объект, над которым вы можете зацикливаться. Вы можете использовать методы update(), replace() и delete() для выполнения необходимых манипуляций.

1 голос
/ 08 января 2012

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

Если я хорошо понимаю вашу проблему, вам даже не нужно извлекать данные, вам просто нужно указать правильное положение where в методе обновления.

Приведенный ниже код является просто способом изменить рекорд на 500, если рекорд в настоящее время ниже, чем в строке с playerId 5.

int highscore = 500;
int playerId = 5;

ContentValues cv=new ContentValues();
cv.put("highscore", highscore);

String where = "id=? AND highscore<?";
String[] whereArgs = {Integer.toString(playerId), Integer.toString(minimalScore};

db.update("scoretable", cv, where , whereArgs);   

Если вам действительно необходимо выполнить вычисления для данных в базе данных, вам нужно сначала запросить их с помощью db.query (). Вы получите курсор, по которому вы можете перебирать. Этот курсор читает эту базу данных, но не сохраняет все значения. Вы можете извлечь из него всю необходимую информацию и затем сделать соответствующие заявления об обновлении.

Чтобы удалить, например, все баллы ниже 100, вы можете сделать следующее.

int lowestAllowableScore = 100;

db.delete("scoretable", "score<?", new String[] {Integer.toString(lowestAllowableScore)});

редактировать //

Для этого вы можете использовать метод вставки Android:

Обратите внимание, что я не использовал заглавные буквы для запуска переменных.

ContentValues value=new ContentValues();
    value.put("score", curscore); // We want to put curscore in the new row in the score column
    value.put("mode", curmode);
    value.put("diff", curdiff);
    value.put("date", curdate);
db.insert("scoretable",null,value);

Вы должны взглянуть на документацию sqlite для операторов вставки. С помощью методов Android нет необходимости создавать настоящий код SQL.

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