Android SQlite外键冲突
我有一个问题,那就是我正在做一个基于数据库存储地址ip和ip等记录的程序。 我在数据库中有两个表,一个叫做automata,它存储IP地址(密钥)、公司名称和您要放入IP地址的名称 另一个表称为records,它使用ip自动机将地址记录(key)、这些记录的名称、记录类型和外键保存到此relaccionada id_ip表 源(SQLite): 我想要的是保留一个记录,其中使用微调器记录lame自动机的IP地址,并记录用户插入的地址。问题是,当我键入自动机的IP地址时,该地址失败,未被很好地识别,并且不知道原因。。。。我绝望了Android SQlite外键冲突,android,sqlite,foreign-keys,Android,Sqlite,Foreign Keys,我有一个问题,那就是我正在做一个基于数据库存储地址ip和ip等记录的程序。 我在数据库中有两个表,一个叫做automata,它存储IP地址(密钥)、公司名称和您要放入IP地址的名称 另一个表称为records,它使用ip自动机将地址记录(key)、这些记录的名称、记录类型和外键保存到此relaccionada id_ip表 源(SQLite): 我想要的是保留一个记录,其中使用微调器记录lame自动机的IP地址,并记录用户插入的地址。问题是,当我键入自动机的IP地址时,该地址失败,未被很好地识别
public class guardar_registros extends Activity {
Spinner spinner1,spinner2;
EditText nombre,direccion;
Button boton;
String basededatos= "BDautomata.db";
String registro_ip,tipo_registro;
int i = 0,flag=0;
Cursor cur;
String[] lista_ip = new String [20];
ArrayAdapter <CharSequence> lista;
List<String> lista_contactos = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.guardar_registros);
spinner1=(Spinner) findViewById(R.id.spinnerTipoRegistro);
spinner2=(Spinner) findViewById(R.id.spinnerIP);
nombre = (EditText)findViewById(R.id.NombreRegistro);
direccion = (EditText)findViewById(R.id.dirRegistro);
boton = (Button)findViewById(R.id.btnGuardarRegistro);
lista = new ArrayAdapter <CharSequence> (this, android.R.layout.simple_spinner_item );
lista.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
lista.add("Entero");
lista.add("Real(1 decimal)");
lista.add("Real (2 decimales)");
lista.add("Binario");
spinner1.setAdapter(lista);
cur = obtenerIP();
SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this,android.R.layout.simple_spinner_item , cur, new String[]{"_id"}, new int[] { android.R.id.text1 },0);
mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner2.setAdapter(mAdapter);
spinner2.setOnItemSelectedListener(new SpinnerListener2());
spinner1.setOnItemSelectedListener(new SpinnerListener1());
}
public Cursor obtenerIP (){
AdminSQLiteOpenHelper automata= new AdminSQLiteOpenHelper(this, "BDautomata", null, 1);
SQLiteDatabase bd = automata.getReadableDatabase();
Cursor c = bd.rawQuery(" SELECT ip AS _id FROM automata ", null);
return c;
}
public void guardarRegistro(View v) {
AdminSQLiteOpenHelper automata= new AdminSQLiteOpenHelper(this, "BDautomata", null, 1);
SQLiteDatabase bd = automata.getWritableDatabase();
if (bd!=null){
String nombreRegistro = nombre.getText().toString();
String direccionR = direccion.getText().toString();
ContentValues cv = new ContentValues();
cv.put("id_ip", registro_ip);
cv.put("direccion", direccionR);
cv.put("nombreAutomata", nombreRegistro);
cv.put("tipo", tipo_registro);
bd.insert("registro", "direccion", cv);
Toast.makeText(this, "Se guardaron los datos del automata",Toast.LENGTH_SHORT).show();
//comprobamos que funciona
}else
Toast.makeText(this, "Error al crear la base de datos", Toast.LENGTH_SHORT).show();
}
// Listener para el spinner2 el cual tiene las ip de los automatas
public class SpinnerListener2 implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent,
View view, int pos, long id) {
registro_ip=parent.getItemAtPosition(pos).toString();
}
public void onNothingSelected(AdapterView<?> parent) {
//para asegurar que el usuario selecciona una ip
//flag=0;
}
}
//Listener del Spinner1 el cuel contiene el tipo del registro.
public class SpinnerListener1 implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent,
View view, int pos, long id) {
tipo_registro=parent.getItemAtPosition(pos).toString();
//flag=1;
}
public void onNothingSelected(AdapterView<?> parent) {
//para asegurar que el usuario selecciona una ip//flag=0;
}
}
}
谢谢您的关注。您想要插入的
注册表ip
的实际值是多少?我想要的是插入到ip注册表ip中,该ip是字符串类型,但问题是它很好地获取了数据。我调试并保存了resgistro_ip这个:android.database.sqlite.SQLiteCursor@40dfba18,不知道为什么=(我不明白“抓取数据好”是什么意思。registro_ip
是一个字符串,你的“SQLiteCursor”输出与此无关。我修复了返回游标的问题,并将其视为stringcursor cursor=(SQLiteCursor)spinner2.getSelectedItem();registro_ip=cursor.getString(0);depuracion.setText(registro_ip);spinner1.setOnItemSelectedListener(新SpinnerListener1())
一旦我遇到这个问题,就修复了这个问题,它不是注册表,说没有这样的注册表new logcat:09-25 07:27:45.976:E/SQLiteLog(1151):(1)没有这样的表:registro 09-25 07:27:46.176:E/SQLiteDatabase(1151):插入id_ip=a nombreAutomata=qwer direccion=1234 tipo=Entero 09-25 07:27:46.176:E/SQLiteDatabase(1151):android.database.sqlite.SQLiteException:没有这样的表:registro(代码1):,编译时:插入registro(id_ip,nombreAutomata,direccion,tipo)值(?,,,,,,,,?)
public class guardar_registros extends Activity {
Spinner spinner1,spinner2;
EditText nombre,direccion;
Button boton;
String basededatos= "BDautomata.db";
String registro_ip,tipo_registro;
int i = 0,flag=0;
Cursor cur;
String[] lista_ip = new String [20];
ArrayAdapter <CharSequence> lista;
List<String> lista_contactos = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.guardar_registros);
spinner1=(Spinner) findViewById(R.id.spinnerTipoRegistro);
spinner2=(Spinner) findViewById(R.id.spinnerIP);
nombre = (EditText)findViewById(R.id.NombreRegistro);
direccion = (EditText)findViewById(R.id.dirRegistro);
boton = (Button)findViewById(R.id.btnGuardarRegistro);
lista = new ArrayAdapter <CharSequence> (this, android.R.layout.simple_spinner_item );
lista.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
lista.add("Entero");
lista.add("Real(1 decimal)");
lista.add("Real (2 decimales)");
lista.add("Binario");
spinner1.setAdapter(lista);
cur = obtenerIP();
SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this,android.R.layout.simple_spinner_item , cur, new String[]{"_id"}, new int[] { android.R.id.text1 },0);
mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner2.setAdapter(mAdapter);
spinner2.setOnItemSelectedListener(new SpinnerListener2());
spinner1.setOnItemSelectedListener(new SpinnerListener1());
}
public Cursor obtenerIP (){
AdminSQLiteOpenHelper automata= new AdminSQLiteOpenHelper(this, "BDautomata", null, 1);
SQLiteDatabase bd = automata.getReadableDatabase();
Cursor c = bd.rawQuery(" SELECT ip AS _id FROM automata ", null);
return c;
}
public void guardarRegistro(View v) {
AdminSQLiteOpenHelper automata= new AdminSQLiteOpenHelper(this, "BDautomata", null, 1);
SQLiteDatabase bd = automata.getWritableDatabase();
if (bd!=null){
String nombreRegistro = nombre.getText().toString();
String direccionR = direccion.getText().toString();
ContentValues cv = new ContentValues();
cv.put("id_ip", registro_ip);
cv.put("direccion", direccionR);
cv.put("nombreAutomata", nombreRegistro);
cv.put("tipo", tipo_registro);
bd.insert("registro", "direccion", cv);
Toast.makeText(this, "Se guardaron los datos del automata",Toast.LENGTH_SHORT).show();
//comprobamos que funciona
}else
Toast.makeText(this, "Error al crear la base de datos", Toast.LENGTH_SHORT).show();
}
// Listener para el spinner2 el cual tiene las ip de los automatas
public class SpinnerListener2 implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent,
View view, int pos, long id) {
registro_ip=parent.getItemAtPosition(pos).toString();
}
public void onNothingSelected(AdapterView<?> parent) {
//para asegurar que el usuario selecciona una ip
//flag=0;
}
}
//Listener del Spinner1 el cuel contiene el tipo del registro.
public class SpinnerListener1 implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent,
View view, int pos, long id) {
tipo_registro=parent.getItemAtPosition(pos).toString();
//flag=1;
}
public void onNothingSelected(AdapterView<?> parent) {
//para asegurar que el usuario selecciona una ip//flag=0;
}
}
}
09-24 09:56:42.707: E/SQLiteDatabase(9212): Error inserting nombreAutomata=asd id_ip=android.database.sqlite.SQLiteCursor@40dfbc68 direccion=123 tipo=Entero
09-24 09:56:42.707: E/SQLiteDatabase(9212): android.database.sqlite.SQLiteConstraintException: Foreign Key Violation (code 19)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:775)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at com.JR.scada.guardar_registros.guardarRegistro(guardar_registros.java:84)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at java.lang.reflect.Method.invokeNative(Native Method)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at java.lang.reflect.Method.invoke(Method.java:511)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at android.view.View$1.onClick(View.java:3594)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at android.view.View.performClick(View.java:4204)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at android.view.View$PerformClick.run(View.java:17355)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at android.os.Handler.handleCallback(Handler.java:725)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at android.os.Handler.dispatchMessage(Handler.java:92)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at android.os.Looper.loop(Looper.java:137)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at android.app.ActivityThread.main(ActivityThread.java:5041)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at java.lang.reflect.Method.invokeNative(Native Method)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at java.lang.reflect.Method.invoke(Method.java:511)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
09-24 09:56:42.707: E/SQLiteDatabase(9212): at dalvik.system.NativeStart.main(Native Method)