Страница 1 из 1

Проблема с БД

Добавлено: 25 дек 2014, 17:34
Lambrador
Доброго времени суток. Мучаюсь уже несколько дней, никак не могу найти ошибку. Буду очень признательным за помощь.
Вот код для создания БД и т.д.

Код: Выделить всё

public class DatabaseHelper extends SQLiteOpenHelper implements BaseColumns {
    private static final String DATABASE_NAME = "mydatabase.db";
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_TABLE = "user_information";
    public static final String COLUMN_ID = "_id";
    public static final String USER_SEX = "sex";
    public static final String USER_WEIGHT = "user_weight";
    public static final String USER_HEIGHT = "user height";
    public static final String USER_NAME = "user_name";
    public static final String USER_SECONDNAME = "user_secondname";
    public static final String USER_DATA = "user_data";
    public static final String USER_HEALTHNUMBER= "user_healthnumber";
    public static final String USER_BLOOD = "user_blood";

    private static final String DATABASE_CREATE_SCRIPT = "create table "
            + DATABASE_TABLE + "(" + COLUMN_ID
            + " integer primary key autoincrement, " + USER_SEX + " text not null, " + USER_NAME
            + " text not null, " + USER_SECONDNAME + " text not null, "
            + USER_WEIGHT + " integer, " + USER_HEIGHT + " integer, " + USER_BLOOD + " text not null, "
            + USER_HEALTHNUMBER + " integer, "
            + USER_DATA + " integer" + ");";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }

 @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(DATABASE_CREATE_SCRIPT);
 }
  @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        // Запишем в журнал
        Log.w("SQLite", "Обновляемся с версии " + oldVersion + " на версию " + newVersion);

        // Удаляем старую таблицу и создаём новую
        db.execSQL("DROP TABLE IF IT EXIST " + DATABASE_TABLE);
        // Создаём новую таблицу
        onCreate(db);
    }
}


Код для Активити, где заполняется БД и ее вывод(тест)

Код: Выделить всё

public class FirstScreenActivity extends Activity {
    EditText editName, editSecondName, editData, editHeight, editWeight, editBlood, editHealthInsuranceNumber;
    TextView textName, textSecondName, textData, textHeight, textWeight,textBlood, textHealthInsuranceNumber, textSex;
    String name, secondname, data, height, weight, blood, healthnumber, sex;
    Spinner spinnerSex;
    String dbd ="0" ;
    Button savePersonalBase;
    DatabaseHelper databaseHp;
    SQLiteDatabase user;


    @Override
    protected  void onCreate(Bundle savedInstaceState){
        super.onCreate(savedInstaceState);
        setContentView(R.layout.activity_firstscreen);

       
        databaseHp = new DatabaseHelper(this);
        user = databaseHp.getWritableDatabase();
       
        
        editName = (EditText)findViewById(R.id.editName);
        editSecondName = (EditText)findViewById(R.id.editSecondName);
        editData = (EditText)findViewById(R.id.editData);
        editHeight = (EditText)findViewById(R.id.editGrowth);
        editWeight = (EditText)findViewById(R.id.editWeight);
        editBlood = (EditText)findViewById(R.id.editBlood);
        editHealthInsuranceNumber = (EditText)findViewById(R.id.editStrahovka);

        
        textName = (TextView)findViewById(R.id.textName);
        textSecondName = (TextView)findViewById(R.id.textSecondName);
        textData = (TextView)findViewById(R.id.textData);
        textHeight = (TextView)findViewById(R.id.textGrowth);
        textWeight = (TextView)findViewById(R.id.textWeight);
        textBlood = (TextView)findViewById(R.id.textBlood);
        textHealthInsuranceNumber = (TextView)findViewById(R.id.textStrahovka);
        textSex = (TextView)findViewById(R.id.textGender);


        
        savePersonalBase = (Button)findViewById(R.id.SaveButton);
        spinnerSex = (Spinner)findViewById(R.id.spinnerSex);

 }

    public void onClickSaveButton(View v){

        if (editName.getText().toString().equals("")){
            Toast toast = Toast.makeText(getApplicationContext(),
                    "Пожалуйста, заполните все", Toast.LENGTH_SHORT);
            toast.show();
        }
       else if(editSecondName.getText().toString().equals("")){
            Toast toast = Toast.makeText(getApplicationContext(),
                    "Пожалуйста, заполните все", Toast.LENGTH_SHORT);
            toast.show();
        }
        else if(editData.getText().toString().equals("")){
            Toast toast = Toast.makeText(getApplicationContext(),
                    "Пожалуйста, заполните все", Toast.LENGTH_SHORT);
            toast.show();
        }
        else if(editWeight.getText().toString().equals("")){
            Toast toast = Toast.makeText(getApplicationContext(),
                    "Пожалуйста, заполните все", Toast.LENGTH_SHORT);
            toast.show();
        }
        else if(editHealthInsuranceNumber.getText().toString().equals("")){
            Toast toast = Toast.makeText(getApplicationContext(),
                    "Пожалуйста, заполните все", Toast.LENGTH_SHORT);
            toast.show();
        }
        else if(editHeight.getText().toString().equals("")){
            Toast toast = Toast.makeText(getApplicationContext(),
                    "Пожалуйста, заполните все", Toast.LENGTH_SHORT);
            toast.show();
        }
        else if(editBlood.getText().toString().equals("")){
            Toast toast = Toast.makeText(getApplicationContext(),
                    "Пожалуйста, заполните все", Toast.LENGTH_SHORT);
            toast.show();
        }
        else{
            ContentOperation();
        }


    }

    public void ContentOperation(){
        
        ContentValues user_content = new ContentValues();

        name = editName.getText().toString();
        secondname = editSecondName.getText().toString();
        data = editData.getText().toString();
        height = editHeight.getText().toString();
        weight = editWeight.getText().toString();
        blood = editBlood.getText().toString();
        healthnumber = editHealthInsuranceNumber.getText().toString();
        sex = spinnerSex.getSelectedItem().toString();

       
        user_content.put(DatabaseHelper.USER_NAME, name);
        user_content.put(DatabaseHelper.USER_SECONDNAME, secondname);
        user_content.put(DatabaseHelper.USER_SEX, sex);
        user_content.put(DatabaseHelper.USER_DATA, data);
        user_content.put(DatabaseHelper.USER_HEIGHT, height);
        user_content.put(DatabaseHelper.USER_WEIGHT, weight);
        user_content.put(DatabaseHelper.USER_BLOOD, blood);
        user_content.put(DatabaseHelper.USER_HEALTHNUMBER, healthnumber);
        
        user.insert("user_information", null, user_content);


        Cursor c = user.query("user_information",null, null, null, null, null, null);
        
        int nameColIndex = c.getColumnIndex(DatabaseHelper.USER_NAME);
        int secondnameColIndex = c.getColumnIndex(DatabaseHelper.USER_SECONDNAME);
        


        textHealthInsuranceNumber.setText("name = "+c.getString(nameColIndex) + " Second name =  " + c.getString(secondnameColIndex));
        c.close();

    }
}
Чую, что ошибка ясна и пахуча.

Re: Проблема с БД

Добавлено: 25 дек 2014, 17:39
Mikhail_dev
Ошибка не ясна, но пахуча. Идите по запаху и найдитё её (смотрите вебинар viewtopic.php?f=60&t=3198), а дальше покажите здесь

Re: Проблема с БД

Добавлено: 25 дек 2014, 21:04
Lambrador
Как я понял по логу, ошибка в самой таблице и отправке данных.

Код: Выделить всё

12-25 17:49:58.927    1269-1269/com.example.lambrador.personaldoctor_002 E/SQLiteLog﹕ (1) table user_information has no column named user_height
12-25 17:49:59.061    1269-1269/com.example.lambrador.personaldoctor_002 E/SQLiteDatabase﹕ Error inserting user_data=21 user_healthnumber=12334 user_weight=43 user_secondname=asd user_blood=fd2134123 user_height=32 sex=Man user_name=asd
    android.database.sqlite.SQLiteException: table user_information has no column named user_height (code 1): , while compiling: INSERT INTO user_information(user_data,user_healthnumber,user_weight,user_secondname,user_blood,user_height,sex,user_name) VALUES (?,?,?,?,?,?,?,?)
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
            at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
            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.insertWithOnConflict(SQLiteDatabase.java:1469)
            at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
            at com.example.lambrador.personaldoctor_002.FirstScreenActivity.ContentOperation(FirstScreenActivity.java:139)
            at com.example.lambrador.personaldoctor_002.FirstScreenActivity.onClickSaveButton(FirstScreenActivity.java:109)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.view.View$1.onClick(View.java:4002)
            at android.view.View.performClick(View.java:4756)
            at android.view.View$PerformClick.run(View.java:19749)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
12-25 17:49:59.101    1269-1269/com.example.lambrador.personaldoctor_002 E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.lambrador.personaldoctor_002, PID: 1269
    java.lang.IllegalStateException: Could not execute method of the activity
            at android.view.View$1.onClick(View.java:4007)
            at android.view.View.performClick(View.java:4756)
            at android.view.View$PerformClick.run(View.java:19749)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.view.View$1.onClick(View.java:4002)
            at android.view.View.performClick(View.java:4756)
            at android.view.View$PerformClick.run(View.java:19749)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
            at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426)
            at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
            at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
            at com.example.lambrador.personaldoctor_002.FirstScreenActivity.ContentOperation(FirstScreenActivity.java:153)
            at com.example.lambrador.personaldoctor_002.FirstScreenActivity.onClickSaveButton(FirstScreenActivity.java:109)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at android.view.View$1.onClick(View.java:4002)
            at android.view.View.performClick(View.java:4756)
            at android.view.View$PerformClick.run(View.java:19749)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Как видно, таблица не имеет столбец user_height. Хотя, вроде бы, я написал все правильно.

Re: Проблема с БД

Добавлено: 25 дек 2014, 21:43
KamiSempai
Возможно вы добавили это поле в код позже и его небыло в момент создания базы данных. Попробуйте удалить приложение с устройства и переустановить его заново.

Re: Проблема с БД

Добавлено: 26 дек 2014, 20:23
Lambrador
KamiSempai, вы правы. После переустановки появилась другая ошибка, к сожалению, я ее не сохранил. Был конфликт с классом BaseColumn, что не удивительно.. ведь я вызывал первичный ключ

Код: Выделить всё

 
private static final String DATABASE_CREATE_SCRIPT = "create table "
            + DATABASE_TABLE + "(" + COLUMN_ID
            + " [u][b]integer primary key autoincrement[/b][/u], " + USER_SEX + " text not null, " + USER_NAME
            + " text not null, " + USER_SECONDNAME + " text not null, "
            + USER_WEIGHT + " integer, " + USER_HEIGHT + " integer, " + USER_BLOOD + " text not null, "
            + USER_HEALTHNUMBER + " integer, "
            + USER_DATA + " integer" + ");";
После чего все благополучно заработало.
KamiSempai, большое вам спасибо. Так бы я еще сотню лет мучился.
Mikhail_dev, вебинар мне очень и очень помог. Как же с логом жить проще. Большое вам спасибо.