2010-10-23 3 views
4

J'essaie de créer une base de données multi-tables pour mon application android. Je suis la suggestion donnée sur ce site http://androidforbeginners.blogspot.com/2010/01/creating-multiple-sqlite-database.html pour le faire. Je continue à obtenir l'erreur ci-dessous. L'erreur semble être causée par l'onCreate des tables de données.Création d'une base de données SQL multi-tables dans android

Si vous regardez mon onCreate dans la classe DBHelper j'en ai deux mis en commentaire. Cela lui permet de travailler, peu importe lequel est laissé non-validé.

Il doit y avoir un moyen de créer une base de données multi-table, car une seule table dans une base de données va presque à l'encontre de l'objectif d'avoir une base de données.

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 

Merci d'avance.

Voici mon code

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); 
    } 
} 
    } 

Répondre

0

Mettez une déclaration Log dans votre méthode open() lorsque vous prenez le SQLiteException pour voir si ticketDBHelper.getWritableDatabase() est défaillant et appelant ensuite ticketDBHelper.getReadableDatabase(), qui, comme son nom l'indique, ouvre la base de données de lecture -seulement.

+0

10-23 18: 57: 08.672: ERROR/AndroidRuntime (350): Provoqué par: android.database.sqlite.SQLiteException: impossible de mettre à niveau la base de données en lecture seule de la version 0 à 1:/data/data/com .parkingticket/databases/Tickets.db – user434455

+0

même quand je reçois cette erreur, mon journal dit que je suis dans le getWritable – user434455

0

J'ai écrit une application multi-tables qui fonctionne bien. On dirait que vous pouvez avoir un problème en ouvrant le fichier db existant pour l'écriture. Je suggère de supprimer cela à partir de votre émulateur/périphérique, incrémenter le numéro de version et réexécuter l'application. Ma méthode ouverte est collée ici.

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

Anthony Nolan

0

J'ai trouvé une solution au problème, mais pas une réponse directe sur ce site.

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

Pourquoi utiliser une classe abstraite pour créer les bases de données l'extension de cette classe fonctionne, je ne peux pas comprendre la vie de moi parce qu'il semble que je fais la même chose dans mon une classe au-dessus . Néanmoins, cela fonctionne aussi loin que j'ai joué avec.

1

Je sais que je suis en retard, mais je pense que cela pourrait aider d'autres personnes à lire cet article. J'ai eu le même problème et il est sur les espaces, être très prudent lorsque vous écrivez des requêtes SQL sur exemple spaces.For dans le code ci-dessus, vous pouvez remarquer qu'il n'y a pas d'espace à la fin:

KEY_OFFICERBADGE + "text not null"

Donc, fondamentalement, vous avez déclaré une colonne sans type. J'espère que cela a aidé.

Questions connexes