Android SQlite外键冲突

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地址时,该地址失败,未被很好地识别

我有一个问题,那就是我正在做一个基于数据库存储地址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”输出与此无关。我修复了返回游标的问题,并将其视为string
cursor 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)