簡體   English   中英

數據未插入SQLite數據庫

[英]Data Not Being Inserted Into SQLite Database

我正在編寫一個游戲,該游戲使用SQLite數據庫存儲代表用戶獲得的資源的整數值。 我有一個圖像按鈕,當按下該按鈕時,它將使用處理程序作為計時器來調用服務。 此計時器在設置的時間段內向用戶的總資源中添加一定數量的資源。 問題是,當我嘗試將新數據插入數據庫時​​,無法正確插入。 奇怪的是,我原來的測試電話(運行froyo)運行插入操作就很好。 切換到帶有kitkat的電話后,它將不再插入。 我已經運行了sqlite3工具,並且數據庫創建正確,所有值都保持為零。 閱讀也可以從我嘗試過的一些測試中進行。 讓我知道您是否在這里看到任何我可能遺失的東西,因為這個問題困擾了我數周了。 多謝你們。

這是創建表的數據庫的代碼,其中包含一行數據:

public class Database 
{
public static final String KEY_ROWID = "_id";
public static final String KEY_ROCK = "amount_of_rock";
public static final String KEY_METEORROCK = "amount_of_meteor_rock";
public static final String KEY_WATER = "amount_of_water";
public static final String KEY_SHOVEL = "shovel_level";
public static final String KEY_SHOVELEXP = "shovel_experience";
public static final String KEY_BUCKET = "bucket_level";
public static final String KEY_BUCKETEXP = "bucket_experience";
public static final String KEY_PICKAXE = "pickaxe_level";
public static final String KEY_PICKAXEEXP = "pickaxe_experience";
public static final String KEY_POPULATION = "population";

private static final String DATABASE_NAME = "2023db";
private static final String DATABASE_TABLE = "maintable";
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);      
    }//end DbHelper constructor

    @Override
    public void onCreate(SQLiteDatabase db) 
    {
        //create table
        db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
            KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            KEY_ROCK + " INTEGER, " + 
            KEY_METEORROCK + " INTEGER, " +
            KEY_WATER + " INTEGER, " +
            KEY_POPULATION + " INTEGER, " +
            KEY_SHOVEL + " INTEGER, " + 
            KEY_BUCKET + " INTEGER, " +
            KEY_PICKAXE + " INTEGER, " +
            KEY_SHOVELEXP + " INTEGER, " +
            KEY_BUCKETEXP + " INTEGER, " +
            KEY_PICKAXEEXP + " INTEGER);");
    }//end onCreate function

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    {
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
        onCreate(db);
    }//end onUpgrade function
}//end DbHelper class

public Database(Context c)
{
    ourContext = c;
}//end Database constructor

public Database open() {
    ourHelper = new DbHelper(ourContext);
    ourDatabase = ourHelper.getWritableDatabase();
    return this;
}//end Database open function

public void close() {
    ourHelper.close();
}//end close function

public long rockAmountEntry(int rockAmount) {
    ContentValues cv = new ContentValues();
    cv.put(KEY_ROCK, rockAmount);
    return ourDatabase.update(DATABASE_TABLE, cv, null, null);
}//end rockAmountEntry function

public int getRockAmount() {
    int rockAmount = 0, iRockAmount = 0;
    String[] columns = new String[] {KEY_ROWID, KEY_ROCK, KEY_METEORROCK,
        KEY_WATER, KEY_POPULATION, KEY_SHOVEL, KEY_BUCKET, KEY_PICKAXE,
        KEY_SHOVELEXP, KEY_BUCKETEXP, KEY_PICKAXEEXP
    };
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);

    if (c != null && c.getCount() > 0) {
        if (c.moveToFirst()) {
            iRockAmount = c.getColumnIndex(KEY_ROCK);
            rockAmount = c.getInt(iRockAmount);
        }//end if
        c.close();
        return rockAmount;
    }//end if
    return 0;
}//end getRockAmount function
}//end Database

為用戶提供了一個圖像按鈕,他們可以單擊該按鈕來獲取資源。 單擊它時,它將調用服務,該服務將處理程序作為計時器運行,並根據用戶級別向數據庫中添加一定數量的岩石。

這是上面提到的imagebutton的代碼:

spaceRock1 = (ImageButton) findViewById(R.id.spaceRockButton1);
spaceRock1.setOnClickListener(new OnClickListener()
{
    @Override
    public void onClick(View v)
    {   
        Toast.makeText(getApplicationContext(), "Attempting to Gain Resources", Toast.LENGTH_SHORT).show();

        //button cannot be clicked
        spaceRock1.setEnabled(false);

        //start service for timer
        startService(new Intent(runGraphics.this, SetupTimerSR1.class));

        //stop service for timer
        stopService(new Intent(runGraphics.this, SetupTimerSR1.class));

        //button can be clicked again
        mMessageReceiver3 = new BroadcastReceiver()
        {
            @Override
            public void onReceive(Context context, Intent intent) 
            {
                clickOnOff3 = intent.getBooleanExtra("spaceRock1Stat", false);
                spaceRock1.setEnabled(clickOnOff3);
                if (clickOnOff3)
                {
                    updateScores();
                }//end if
            }//end onReceive function
        };
        LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(mMessageReceiver3, new IntentFilter("spaceRock1Status"));

    }//end onClick function
});//end setOnClickListener

這是按下imagebutton時調用的服務代碼:

public class SetupTimerSR1 extends Service {
Handler handler;
Database data;
Intent i;
int pickLevel = 1, pickExpTotal = 0;
int rockAmount = 0, pickExp = 0, totalRock = 0;
int timerCount = 0;
@Override
public IBinder onBind(Intent intent) {
    return null;
}//end onBind function

@Override
public void onCreate() {
    super.onCreate();

    //setup 24 hour timer
    handler = new Handler(Looper.getMainLooper());
    handler.postDelayed(runnable, 5000);
}//end onCreate function

private Runnable runnable = new Runnable() {
    public void run() {
        //check experience for current level
        if (pickExp < 3000) {
            pickLevel = 1;
        }//end if
        else if (pickExp > 3000 && pickExp < 6000) {
            pickLevel = 2;
        }//end else if
        else if (pickExp > 6000 && pickExp < 9000) {
            pickLevel = 3;
        }//end else if
        else if (pickExp > 9000 && pickExp < 12000) {
            pickLevel = 4;
        }//end else if
        else if (pickExp > 12000) {
            pickLevel = 5;
        }//end else if

        //give resource based on level
        if (pickLevel == 1) {
            rockAmount += 1;
            pickExp += 10;
        }//end if
        else if (pickLevel == 2) {
            rockAmount += 3;
            pickExp += 20;
        }//end else if
        else if (pickLevel == 3) {
            rockAmount += 4;
            pickExp += 30;
        }//end else if
        else if (pickLevel == 4) {
            rockAmount += 5;
            pickExp += 40;
        }//end else if
        else if (pickLevel == 5) {
            rockAmount += 7;
            pickExp += 50;
        }//end else if
        timerCount++;
        if (timerCount < 3) {
            handler.postDelayed(runnable, 5000);
        }//end if
        else {
            //pull data
            data = new Database(SetupTimerSR1.this);
            data.open();
            pickExpTotal = data.getPickExp();
            totalRock = data.getRockAmount();
            data.close();

            //add new data to old
            pickExpTotal += pickExp;
            totalRock += rockAmount;

            //push data
            data.open();
            data.pickExpEntry(pickExpTotal);
            data.rockAmountEntry(totalRock);
            data.close();

            Toast.makeText(getApplicationContext(), "pickExp: " + pickExpTotal, Toast.LENGTH_SHORT).show();
            Toast.makeText(getApplicationContext(), "Total rock: " + totalRock, Toast.LENGTH_SHORT).show();
            i.putExtra("spaceRock1Stat", true);

            LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);
            handler.removeCallbacks(runnable);
        }//end else
    }//end run function
};//end runnable    

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    i = new Intent("spaceRock1Status");
    i.putExtra("spaceRock1Stat", false);

    LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);
    return Service.START_NOT_STICKY;
}//end onStartCommand function
}//end SetupTimerSR1 class

update方法只能更改表中已經存在的行。 但是,該應用程序永遠不會在表中插入任何行。

創建數據庫時應添加該行:

public void onCreate(SQLiteDatabase db)
{
    db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
        ...);
    db.execSQL("INSERT INTO " + DATABASE_TABLE + " DEFAULT VALUES");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM