这个数据操纵器允许我: 1.创建表人物角色(“人物”),我可以毫无问题地添加pacients和医生。
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);
}
}
}
但是当我使用第二个“datamanipulator2”(来自第一个数据操纵器的复制粘贴)时,它应该创建表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 (?,?,?,?)
我注意到如果我将db版本更改为2(在“datamanipulator2”中),我可以修复此问题
DATABASE_VERSION = 2;
但我想知道:A)另一种避免此错误的方法,我的意思是,我想保留两个数据操纵器“DATABASE_VERSION = 1;”我觉得这对我来说听起来更好,除非完全有必要“datamanipulator”的值为1而“datamanipulator2”的值为2. B)为什么会这样?这是正常行为吗?
答案 0 :(得分:2)
如果查看SQLiteOpenHelper类,只在第一次创建数据库时调用onCreate。如果更改了数据库的版本,则调用onUpgrade。更改版本完全符合该目的 - 提供一个钩子来创建其他表格等。
所以,有两种选择: 1.在重新安装应用程序之前完全删除数据库,以便在版本1中创建这两个表。 2.在添加更多表格时继续增加版本。
在开发周期中,我建议使用选项1。
希望这会有所帮助......
答案 1 :(得分:0)
两个表的主键列的列名不能相同。在您的情况下,两个表都具有相同的列名id INTEGER PRIMARY KEY
。尝试这样的事情:
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(create_table_sql);
}
在创建第二个表之前,请使用不同的主键列名更改变量'create_table_sql'(例如:id_2 INTEGER PRIMARY KEY
)。