Сбой программы с "D / ADB_SERVICES: закрытие, потому что is_eof = 1" на insertData - PullRequest
0 голосов
/ 02 июня 2018

Моя программа падает на insertData, и я не знаю, как определить причину этой ошибки (я младший в разработке базы данных Android и никогда раньше не использовал ее).

Я думаю, что мой метод вставки неправильно обрабатывает вставку таких значений, как boolean или int.Может ли кто-нибудь указать причину этой ошибки?

LogCat

06-02 12: 28: 04.439 8601-8601 /?D / ADB_SERVICES: закрытие, потому что is_eof = 1 r = -1 s-> fde.force_eof = 0

My DataBase.java

public class DataBase extends SQLiteOpenHelper{
    public static final String DATABASE_NAME = "DataOfSchedule.db";
    public static final String TABLE_NAME = "DataOfSchedule_table";
    public static final String COL_ID = "ID";
    public static final String COL_NAME = "NAME";
    public static final String COL_AGE = "AGE";
    public static final String COL_GENDER_M = "GENDER_M";
    public static final String COL_GENDER_F = "GENDER_F";
    public static final String COL_WEIGHT = "WEIGHT";
    public static final String COL_HEIGHT = "HEIGHT";
    public static final String COL_TRAUMA = "TRAUMA";

    public DataBase(Context context){
        super(context, DATABASE_NAME, null,1);
    }

    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL("CREATE TABLE" + TABLE_NAME +
                COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COL_NAME + " TEXT," +
                COL_AGE + " INTEGER NOT NULL DEFAULT 0, " +
                COL_GENDER_M + " INTEGER NOT NULL DEFAULT 0, " +
                COL_GENDER_F + " INTEGER NOT NULL DEFAULT 0, " +
                COL_TRAUMA + " INTEGER NOT NULL DEFAULT 0, " +
                COL_WEIGHT + " INTEGER NOT NULL DEFAULT 0, " +
                COL_HEIGHT + " INTEGER NOT NULL DEFAULT 0);");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
        db.execSQL("DROP TABLE IF EXISTS" + TABLE_NAME);
    }

    //  public boolean insertData(String name, Integer age, Integer sex_male, Integer sex_female, Integer weight, Integer height, Integer trauma){
    //    SQLiteDatabase db = this.getWritableDatabase();
    //    ContentValues contentValues = new ContentValues();
        public boolean insertData(String name, int age, int gender_m, int gender_f, int weight, int height, int trauma){
            boolean success = false;
            try{
                SQLiteDatabase db = this.getWritableDatabase();
                ContentValues contentValues = new ContentValues();
                contentValues.put(COL_NAME, name);
                contentValues.put(COL_AGE, age);
                contentValues.put(COL_GENDER_M, gender_m);
                contentValues.put(COL_GENDER_F, gender_f);
                contentValues.put(COL_WEIGHT, weight);
                contentValues.put(COL_HEIGHT, height);
                contentValues.put(COL_TRAUMA, trauma);
                long result = db.insert(TABLE_NAME,null,contentValues);
                db.close();

                if(result != -1) success = true;
            }
            catch(Exception ex){

            }

            return success;
        }

    public Cursor getALLData(){
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor res = db.rawQuery("Select * from "+ TABLE_NAME,null);
        return res;
    }
}

My InsertData.java

public class InsertData extends AppCompatActivity {
    DataBase myDb;
    EditText txtName, txtAge , txtWeight, txtHeight;
    CheckBox boxGender_m,boxGender_f,boxTrauma;
    Button btnClick;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_insert_data);
        myDb = new DataBase(this);
        txtName = (EditText) findViewById(R.id.name);
        txtAge = (EditText) findViewById(R.id.age);
        boxGender_m = (CheckBox) findViewById(R.id.gender_m);
        boxGender_f = (CheckBox) findViewById(R.id.gender_f);
        boxTrauma = (CheckBox) findViewById(R.id.trauma);
        txtWeight = (EditText) findViewById(R.id.weight);
        txtHeight = (EditText) findViewById(R.id.height);
        btnClick = (Button) findViewById(R.id.InsertBtn);
        btnClick.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                ClickMe();
            }
        });
    }

    private void ClickMe(){
        String name = txtName.getText().toString();
        String age = txtAge.getText().toString();
       // String gender_m = boxGender_m.getText().toString(); Wrong
       // String gender_f = boxGender_f.getText().toString(); Wrong
        // String trauma = boxTrauma.getText().toString();
        String weight = txtName.getText().toString();
        String height = txtName.getText().toString();
        int gender_int_m = 0;
        if (boxGender_m.isChecked()) {
            gender_int_m = 1;
        }
        int gender_int_f = 0;
        if (boxGender_f.isChecked()) {
            gender_int_f = 1;
        }
        int trauma_int = 0;
        if (boxTrauma.isChecked()) {
            gender_int_f = 1;
        }
      // int gender_int_m = Integer.parseInt(gender_m);
       // int gender_int_f = Integer.parseInt(gender_f);
       // int trauma_int = Integer.parseInt(trauma);
        int weight_int = Integer.parseInt(weight);
        int age_int = Integer.parseInt(age);
        int height_int = Integer.parseInt(height);
        Boolean result = myDb.insertData (name, age_int, gender_int_m, gender_int_f, weight_int, height_int, trauma_int);
        if (result == true){
            Toast.makeText(this, "Data Inserted Successfully",Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "Data Inserted Failed",Toast.LENGTH_SHORT).show();
        }
        Intent i = new Intent(this,ResultData.class);
        startActivity(i);
    }

}

InsertData - layout.html

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context="daniel_nikulshyn_and_andrew_rybka.myway.InsertData">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true">
    <TextView
        android:id="@+id/heading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/insert_heading"
        android:layout_gravity="center"
        android:textSize="16dp"
        android:textColor="#021aee"/>

    <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/insert_name"/>
    <EditText
        android:id="@+id/age"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/insert_age"
        android:numeric="integer"/>
    <EditText
        android:id="@+id/weight"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/insert_weight"
        android:numeric="integer"/>
    <EditText
        android:id="@+id/height"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/insert_height"
        android:numeric="integer"/>

    <TextView
        android:padding="10dp"
        android:text="@string/insert_gender"
        android:layout_gravity="left"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <CheckBox
        android:id="@+id/gender_m"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/male"/>
    <CheckBox
        android:id="@+id/gender_f"
        android:text="@string/female"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:padding="10dp"
        android:text="@string/insert_trauma"
        android:layout_gravity="left"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <CheckBox
        android:id="@+id/trauma"
        android:text="@string/insert_trauma_subtitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dp"/>

    <Button
        android:id="@+id/InsertBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:text="@string/insert_button"
        android:textColor="#f2fde4"
        android:layout_gravity="center"/>
</LinearLayout>

</ScrollView>

1 Ответ

0 голосов
/ 03 июня 2018

У вас возникли проблемы.Тем не менее, D/ADB_SERVICES: closing because is_eof=1 r=-1 s->fde.force_eof=0 не является одним из них.D / указывает, что это сообщение DEBUG и оно не должно быть ограничителем показа (похоже, это сообщение зависит от устройства (реализация Android), некоторые могут получить это сообщение, а другие нет) .

Исключение формата чисел

Перед созданием базы данных и таблицы (при условии только вышеуказанного действия) может произойти сбой вставки (если ввод имени не является числовым), поскольку вы пытаетесь проанализировать имя в качестве целого числа для веса и высоты .

Вы могли бы иметь исключение по следующим направлениям: -

06-03 00:08:31.518 2745-2745/va.vehicleapp E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.NumberFormatException: Invalid int: "Fred"
        at java.lang.Integer.invalidInt(Integer.java:138)
        at java.lang.Integer.parse(Integer.java:375)
        at java.lang.Integer.parseInt(Integer.java:366)
        at java.lang.Integer.parseInt(Integer.java:332)
        at va.vehicleapp.MainActivity.ClickMe(MainActivity.java:172)
        at va.vehicleapp.MainActivity.access$000(MainActivity.java:16)
        at va.vehicleapp.MainActivity$1.onClick(MainActivity.java:44)
        at android.view.View.performClick(View.java:4084)
        at android.view.View$PerformClick.run(View.java:16966)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)

Таким образом, вы должны изменить использование следующих строк в методе onClick: -

    String weight = txtWeight.getText().toString(); // CHANGED to txtWeight not txtName
    String height = txtHeight.getText().toString(); // CHANGED to txtHeight not txtName

Таблица не будет создана

Я подозреваю, что если вы посмотрите наlog вы увидите (или увидели бы когда-нибудь, даже если вы даже дойдете до вызова метода onCreate) что-то вроде: -

06-02 23:24:12.135 2113-2113/? E/SQLiteLog: (1) near "TABLEDataOfSchedule_tableID": syntax error
06-02 23:24:12.135 2113-2113/? D/AndroidRuntime: Shutting down VM
06-02 23:24:12.135 2113-2113/? W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa6244288)
06-02 23:24:12.135 2113-2113/? E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{va.vehicleapp/va.vehicleapp.MainActivity}: android.database.sqlite.SQLiteException: near "TABLEDataOfSchedule_tableID": syntax error (code 1): , while compiling: CREATE TABLEDataOfSchedule_tableID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT,AGE INTEGER NOT NULL DEFAULT 0, GENDER_M INTEGER NOT NULL DEFAULT 0, GENDER_F INTEGER NOT NULL DEFAULT 0, TRAUMA INTEGER NOT NULL DEFAULT 0, WEIGHT INTEGER NOT NULL DEFAULT 0, HEIGHT INTEGER NOT NULL DEFAULT 0);
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
        at android.app.ActivityThread.access$600(ActivityThread.java:130)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.database.sqlite.SQLiteException: near "TABLEDataOfSchedule_tableID": syntax error (code 1): , while compiling: CREATE TABLEDataOfSchedule_tableID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT,AGE INTEGER NOT NULL DEFAULT 0, GENDER_M INTEGER NOT NULL DEFAULT 0, GENDER_F INTEGER NOT NULL DEFAULT 0, TRAUMA INTEGER NOT NULL DEFAULT 0, WEIGHT INTEGER NOT NULL DEFAULT 0, HEIGHT INTEGER NOT NULL DEFAULT 0);
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
        at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
        at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1663)
        at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1594)
        at va.vehicleapp.DataBase.onCreate(DataBase.java:27)
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
        at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
        at va.vehicleapp.MainActivity.onCreate(MainActivity.java:23)
        at android.app.Activity.performCreate(Activity.java:5008)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
        at android.app.ActivityThread.access$600(ActivityThread.java:130) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:137) 
        at android.app.ActivityThread.main(ActivityThread.java:4745) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:511) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
        at dalvik.system.NativeStart.main(Native Method) 

Это потому что в вашей базе данных класс у вас есть несколько омисовsions, пробелы и открывающая скобка, которая приведет к тому, что таблица не будет создана.

Исправлено для них:

  1. изменить метод onCreate на (см. комментарии длявнесены изменения)

: -

@Override
public void onCreate(SQLiteDatabase db){
    db.execSQL("CREATE TABLE " + TABLE_NAME + //<<<< ADDED space
            " (" +  // ADDED to enclose column definition in brackets
            COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COL_NAME + " TEXT," +
            COL_AGE + " INTEGER NOT NULL DEFAULT 0, " +
            COL_GENDER_M + " INTEGER NOT NULL DEFAULT 0, " +
            COL_GENDER_F + " INTEGER NOT NULL DEFAULT 0, " +
            COL_TRAUMA + " INTEGER NOT NULL DEFAULT 0, " +
            COL_WEIGHT + " INTEGER NOT NULL DEFAULT 0, " +
            COL_HEIGHT + " INTEGER NOT NULL DEFAULT 0);");
}

либо удалите данные приложения, удалите приложение или увеличьте версию базы данных до 2, то есть (измените super(context, DATABASE_NAME, null,1); на super(context, DATABASE_NAME, null,2);

, а затем снова запустите приложение.

Результат тестирования

Внесение вышеуказанных изменений, запуск (после удаления данных приложения, важных для создания правильной таблицы) , завершениеполя ввода, используя: -

  • Фред,
  • 10,
  • 21,
  • 45,
  • мужчина (отмечен галочкой)),
  • женщина (отмечена галочкой),
    • умеет ставить галочки оба ???? -insert_trauma_subtitle не отмечена галочкой

в результате подтверждение тоставставки.

...