4

Android アプリケーション用のマルチテーブル データベースを作成しようとしています。私はこのサイトhttp://androidforbeginners.blogspot.com/2010/01/creating-multiple-sqlite-database.htmlで提供されている提案に従っています。以下のエラーが発生し続けます。エラーは、データベース テーブルの onCreate が原因のようです。

DBHelper クラスの onCreate を見ると、2 つのコメント アウトがあります。これにより、どれがコメントされていなくても機能します。

データベース内の単一のテーブルは、データベースを持つ目的をほとんど無効にするため、複数テーブルのデータベースを作成する方法が必要です。

10-23 02:11:35.383: ERROR/AndroidRuntime(300): Caused by: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 0 to 1: /data/data/com.parkingticket/databases/Tickets.db

前もって感謝します。

これが私のコードです

   package com.parkingticket;
   import java.sql.SQLException;
   import android.content.ContentValues;
   import android.content.Context;
   import android.database.Cursor;
   import android.database.sqlite.SQLiteDatabase;
   import android.database.sqlite.SQLiteDatabase.CursorFactory;
   import android.database.sqlite.SQLiteException;
   import android.database.sqlite.SQLiteOpenHelper;
   import android.util.Log;

   public class TicketDBAdapter 
   {
private static final String DATABASE_NAME="Tickets.db";
private static final int DATABASE_VERSION = 1;

private static final String PARKEDCARS_TABLE = "ParkedCars";
private static final String PARKINGMETERS_TABLE = "ParkingMeters";
private static final String PARKINGTICKETS_TABLE = "ParkingTickets";
private static final String POLICEOFFICERS_TABLE = "PoliceOfficers";

// The name and column index for each column in PARKEDCARS
public static final String KEY_CARID = "carID";
    public static final int CARID_COLUMN = 0;
public static final String KEY_CARMAKE = "Make";
    public static final int CARMAKE_COLUMN = 1;
public static final String KEY_CARMODEL = "Model";
    public static final int CARMODEL_COLUMN = 2;
public static final String KEY_CARCOLOR = "Color";
    public static final int CARCOLOR_COLUMN = 3;
public static final String KEY_CARLICENSENUMBER = "LicenseNumber";
    public static final int CARLICENSENUMBER_COLUMN = 4;
public static final String KEY_CARMINUTESPARKED = "MinutesParked";
    public static final int CARMINUTESPARKED_COLUMN = 5;

// The name and column index for each column in PARKINGMETERS
public static final String KEY_METERID = "meterID";
    public static final int METERID_COLUMN = 0;
public static final String KEY_MINUTESPURCHASED = "MinutesPurchased";
    public static final int MINUTESPURCHASED_COLUMN = 1;

// The name and column index for each column in PARKINGTICKETS
    //TODO create the columns and indexs for parking tickets

// The name and column index for each column in POLICEOFFICERS
public static final String KEY_OFFICERID = "officerID";
    public static final int OFFICERID_COLUMN = 0;
public static final String KEY_OFFICERNAME = "Name";
    public static final int OFFICERNAME_COLUMN = 1;
public static final String KEY_OFFICERBADGE = "BadgeNumber";
    public static final int OFFICERBADE_COLUMN = 2;


//Variable to hold the database instance
private SQLiteDatabase ticketDB;

//Context of the application using the database.
private final Context context;

//Database open/upgrade helper
private TicketDBHelper ticketDBHelper;

public TicketDBAdapter(Context _context)
{
    context = _context;
    ticketDBHelper = new TicketDBHelper(context, DATABASE_NAME, null, DATABASE_VERSION);
}

public void open() throws SQLiteException
{
    try
    {
        ticketDB = ticketDBHelper.getWritableDatabase();
    }
    catch(SQLiteException ex)
    {
        ticketDB = ticketDBHelper.getReadableDatabase();
    }
}

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

 //Insert a new ParkedCar
public long insertParkedCar(ParkedCar _car)
{
    //Create a new row of values to insert
    ContentValues newParkedCarValues = new ContentValues();

    //Assign values for each row
    newParkedCarValues.put(KEY_CARMAKE, _car.getMake());
    newParkedCarValues.put(KEY_CARMODEL, _car.getModel());
    newParkedCarValues.put(KEY_CARCOLOR, _car.getColor());
    newParkedCarValues.put(KEY_CARLICENSENUMBER, _car.getLicenseNumber());
    newParkedCarValues.put(KEY_CARMINUTESPARKED, _car.getMinutesParked());

    //Insert the row
    return ticketDB.insert(PARKEDCARS_TABLE, null, newParkedCarValues);
}

//Remove a ParkedCar based on its index
public boolean removeParkedCar(long _rowIndex)
{
    return ticketDB.delete(PARKEDCARS_TABLE, KEY_CARID + "=" + _rowIndex, null)>0;
}

//Update a ParkedCar's MinutesParked
//TODO Create an update for ParkedCar's minutesParked.

public Cursor getAllParkedCarsCursor()
{
    return ticketDB.query(PARKEDCARS_TABLE, new String[] {KEY_CARID, KEY_CARMAKE, KEY_CARMODEL, KEY_CARCOLOR, KEY_CARLICENSENUMBER, KEY_CARMINUTESPARKED}, null, null, null, null, null);
}

public Cursor setCursorParkedCar(long _rowIndex) throws SQLException
{
    Cursor result = ticketDB.query(true, PARKEDCARS_TABLE, new String []{KEY_CARID}, KEY_CARID + "=" + _rowIndex, null, null, null, null, null);

    if ((result.getCount() == 0) || !result.moveToFirst())
    {
        throw new SQLException("No ParkedCar found for row: " + _rowIndex);
    }

    return result;
}

public static class TicketDBHelper extends SQLiteOpenHelper
{
    public TicketDBHelper(Context context, String name, CursorFactory factory, int version)
    {
        super(context, name, factory, version);
    }

    //SQL Statement to create PARKEDCARS table
    private static final String PARKEDCARS_CREATE = "create table " + PARKEDCARS_TABLE + " (" + KEY_CARID + " integer primary key autoincrement, " + KEY_CARMAKE + " text not null," + KEY_CARMODEL + " text not null," + KEY_CARCOLOR + " text not null," + KEY_CARLICENSENUMBER + " text not null," + KEY_CARMINUTESPARKED + "int not null);";

    //SQL Statement to create ParkingMeters table
    private static final String PARKINGMETERS_CREATE = "create table" + PARKINGMETERS_TABLE + " (" + KEY_METERID + " integer primary key autoincrement, " + KEY_MINUTESPURCHASED + " int not null);";

    //SQL Statement to create ParkingTickets table
    //TODO create the statement for parkingTickets

    //SQL Statement to create PoliceOfficers table
    private static final String POLICEOFFICERS_CREATE = "create table" + POLICEOFFICERS_TABLE + " (" + KEY_OFFICERID + " integer primary key autoincrement, " + KEY_OFFICERNAME + " text not null," + KEY_OFFICERBADGE + "text not null);";

    //Called when no database exists in disk and the helper class needs to create a new one.
    @Override
    public void onCreate(SQLiteDatabase _db)
    {
                //_db.execSQL(PARKEDCARS_CREATE);
          _db.execSQL(PARKINGMETERS_CREATE);
                 //_db.execSQL(POLICEOFFICERS_CREATE);
    }

    //Called when there is a database verion mismatch meaning that the version of the database on disk needs to be upgraded to the current version
    @Override
    public void onUpgrade(SQLiteDatabase _db, int _oldVersion, int _newVersion)
    {
        //Log the version upgrade.
        Log.w("TaskDBAdapter", "Upgrading from version " + _oldVersion + " to " + _newVersion + ", which will destroy all old data");

        //Upgrade the existing database to conform to the new version
        //Multiple previous versions can be handled by comparing _oldVersoin and _newVersion values

        //The simplest case is to drop teh old table and create a new one.
        _db.execSQL("DROP TABLE IF EXISTS " + PARKEDCARS_TABLE);
        _db.execSQL("DROP TABLE IF EXISTS " + PARKINGMETERS_TABLE);
        _db.execSQL("DROP TABLE IF EXISTS " + POLICEOFFICERS_TABLE);

        onCreate(_db);
    }
}
  }
4

4 に答える 4

1

私は遅れていることは知っていますが、他の人がこの投稿を読むのに役立つかもしれないと思います。私も同じ問題を抱えていましたが、それはスペースに関するものです。スペースに関するSQLクエリを作成するときは、十分に注意してください。たとえば、上記のコードでは、最後にスペースがないことに気付くでしょう。

KEY_OFFICERBADGE + "text not null"

つまり、基本的に、型のない列を宣言しました。お役に立てば幸いです。

于 2011-04-20T13:58:21.750 に答える
0

Put a Log statement in your open() method when you catch the SQLiteException to see if ticketDBHelper.getWritableDatabase() is failing and subsequently calling ticketDBHelper.getReadableDatabase(), which as the name implies, opens the database as read-only.

于 2010-10-23T07:11:42.530 に答える
0

私は問題の解決策を見つけましたが、このサイトで直接の答えはありません。

http://pheide.com/page/11/tab/24#post13

抽象クラスを使用してデータベースを作成する理由そのクラスを拡張する機能は、上記の1つのクラスでも同じことをしているように見えるため、一生理解できません。それでも、私が遊んだ限り、それは機能します。

于 2010-10-24T01:10:08.727 に答える
0

正常に動作するマルチテーブルアプリを作成しました。書き込み用に既存の db ファイルを開く際に問題が発生する可能性があるようです。エミュレーター/デバイスからそれを削除し、バージョン番号を増やしてアプリを再実行することをお勧めします。私のopenメソッドはここに貼り付けられます。

public DbAdapter open() throws SQLException {
    mDbHelper = new DatabaseHelper(mCtx);
    mDb = mDbHelper.getWritableDatabase();
    return this;
}

アンソニー・ノーラン

于 2010-10-23T08:27:49.070 に答える