0

このデータマニピュレータを使用すると、次のことが可能になります。1.テーブルPersonas( "people")を作成すると、問題なく患者と医師を追加できます。

package com.example.citas.medicas;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
import java.util.ArrayList;
import java.util.List;

public class DataManipulator
{
private static final  String DATABASE_NAME = "mydatabase.db";
private static final int DATABASE_VERSION = 1;
static final String TABLE_NAME = "Personas";
private static Context context;
static SQLiteDatabase db;
private SQLiteStatement insertStmt;
private static final String INSERT = "insert into " + TABLE_NAME + " (nombre,cedula,fechanacimiento,telefonocasa,telefonomovil,tipo) values (?,?,?,?,?,?)";

public DataManipulator(Context context) {
    DataManipulator.context = context;
    OpenHelper openHelper = new OpenHelper(DataManipulator.context);
    DataManipulator.db = openHelper.getWritableDatabase();
    this.insertStmt = DataManipulator.db.compileStatement(INSERT);
}

public long insert(String nombre,String cedula,String fechanacimiento,String telefonocasa,String telefonomovil,String tipo) {
    this.insertStmt.bindString(1, nombre);
    this.insertStmt.bindString(2, cedula);
    this.insertStmt.bindString(3, fechanacimiento);
    this.insertStmt.bindString(4, telefonocasa);
    this.insertStmt.bindString(5, telefonomovil);
    this.insertStmt.bindString(6, tipo);
    return this.insertStmt.executeInsert();
}

public void deleteAll() {
    db.delete(TABLE_NAME, null, null);
}

public List<String[]> selectAll()
{
    List<String[]> list = new ArrayList<String[]>();
    Cursor cursor = db.query(TABLE_NAME, new String[] { "id","nombre","cedula","fechanacimiento","telefonocasa","telefonomovil","tipo" }, null, null, null, null, "name asc"); 
    int x=0;
    if (cursor.moveToFirst()) {
       do {
            String[] b1=new String[]{cursor.getString(0),cursor.getString(1),cursor.getString(2),
            cursor.getString(3),cursor.getString(4),cursor.getString(5),cursor.getString(6)};
            list.add(b1);
            x=x+1;
       } while (cursor.moveToNext());
    }
    if (cursor != null && !cursor.isClosed()) {
       cursor.close();
    } 
    cursor.close();
    return list;
}

public void delete(int rowId) {
    db.delete(TABLE_NAME, null, null); 
}

private static class OpenHelper extends SQLiteOpenHelper {
    OpenHelper(Context context) {
         super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
         db.execSQL("CREATE TABLE " + TABLE_NAME + " (id INTEGER PRIMARY KEY, nombre TEXT, cedula TEXT, fechanacimiento TEXT, telefonocasa TEXT, telefonomovil TEXT, tipo TEXT)");
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    {
         db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
         onCreate(db);
    }
}
}

しかし、この2番目の「datamanipulator2」(1番目のデータマニピュレーターからのコピーアンドペースト)を使用すると、テーブルCitas(「予定」)が作成されるはずなので、予定を追加できますが、次のようなエラーが発生します。

09-23 22:40:57.202: E/AndroidRuntime(889): android.database.sqlite.SQLiteException: no such table: Citas: , while compiling: insert into Citas (nombrepaciente,fechacita,horacita,nombredoctor) values (?,?,?,?)

(「datamanipulator2」で)dbバージョンを2に変更すると、これを修正できることに気付きました。

DATABASE_VERSION = 2;

ただし、次のことを知りたいと思います。A)このエラーを回避する別の方法、つまり、両方のデータマニピュレーターを「DATABASE_VERSION=1;」のままにしておきたい。「datamanipulator」の値が1で、「datamanipulator2」の値が2であることが完全に必要でない限り、一般的には私にとっては良いと思います。B)なぜこれが発生するのですか?これは正常な動作ですか?

4

2 に答える 2

2

クラス SQLiteOpenHelper を見ると、onCreate はデータベースが初めて作成されたときにのみ呼び出されます。onUpgrade は、データベースのバージョンが変更された場合に呼び出されます。バージョンの変更はまさにその目的を果たします-追加のテーブルを作成するためのフックを提供するなど.

したがって、2 つの選択肢があります。 1. アプリケーションを再インストールする前にデータベースを完全に削除して、両方のテーブルがバージョン 1 で作成されるようにします。

開発サイクルでは、オプション 1 を使用することをお勧めします。

お役に立てれば...

于 2012-09-24T05:16:58.660 に答える
0

2 つのテーブルの主キー列に同じ列名を付けることはできません。あなたの場合、両方のテーブルに同じ列名がありid INTEGER PRIMARY KEYます。次のようなことを試してください:

@Override
public void onCreate(SQLiteDatabase db) 
{
    db.execSQL(create_table_sql);
}

2 番目のテーブルを作成する前に、変数 'c​​reate_table_sql' を別の主キー列名 (: などid_2 INTEGER PRIMARY KEY) に変更します。

于 2012-09-24T05:37:11.873 に答える