Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
banga_ivan
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 10
#1

Создание базы данных - Android

30.06.2015, 22:51. Просмотров 327. Ответов 2
Метки нет (Все метки)

Всем доброго времени суток. Пробую писать программу для Android. Сейчас изучаю SQLite. Когда писал код по примерам все работало. База данных создавалась, данные записывались. Сейчас я модифицировал таблицу для своих нужд. И при создании БД получаю ошибку. Сам разобраться с проблемой не в состоянии. Объясните мне пожалуйста в чем проблема. Код под спойлером.
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package com.smart_wallet.smartwallet.db;
 
import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;
 
public class DBHelper extends SQLiteOpenHelper implements BaseColumns {
 
    private static final String DATABASE_NAME = "mydb.db";
    private static final int DATABASE_VERSION = 1;
 
    public static final String TABLE_NAME = "History";
 
    public static final String NAME_COLUMN = "name";
    public static final String PRICE_COLUMN = "price";
    public static final String DESCRIPTION_COLUMN = "description";
    public static final String DATE_COLUMN = "date";
    public static final String TYPE_COLUMN = "type";
 
    private static final String CREATE_DATABASE =
            "create table " + TABLE_NAME + " (" + BaseColumns._ID +
                    " integer not null primary key autoincrement, " +
                    NAME_COLUMN + " text not null, " +
                    PRICE_COLUMN + " decimal not null, " +
                    DATE_COLUMN + " text not null, " +
                    TYPE_COLUMN + " integer not null " +
                    DESCRIPTION_COLUMN + " text);";
 
    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
        super(context, name, factory, version, errorHandler);
    }
 
    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }
 
    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
 
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_DATABASE);
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
    }
}

Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package com.smart_wallet.smartwallet.activity;
 
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
 
import com.smart_wallet.smartwallet.R;
import com.smart_wallet.smartwallet.db.DBHelper;
 
 
public class InPutActivity extends AppCompatActivity {
 
    private EditText name;
    private EditText price;
    private EditText description;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i("InPutActivity", " onCreate ");
 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_in_put);
 
 
    }
 
 
    @Override
    protected void onDestroy() {
        Log.i("InPutActivity", " onDestroy ");
 
        super.onDestroy();
    }
 
    private void preparationData() {
        name = (EditText) findViewById(R.id.name);
        price = (EditText) findViewById(R.id.price);
        description = (EditText) findViewById(R.id.description);
 
        if (!name.getText().toString().equals("")) {
 
            if (!price.getText().toString().equals("")) {
 
                new ThreadBD().execute();
 
                Toast toast = Toast.makeText(getApplicationContext(), "Запис додано!", Toast.LENGTH_LONG);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
 
                finish();
            } else {
                Toast toast = Toast.makeText(getApplicationContext(),
                        "Поле \"Вартість\" не може бути пустимм!", Toast.LENGTH_LONG);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
            }
 
        } else {
            Toast toast = Toast.makeText(getApplicationContext(),
                    "Поле \"Назва\" не може бути пустим!", Toast.LENGTH_LONG);
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.show();
        }
    }
 
    class ThreadBD extends AsyncTask<Void, Void, Void> {
        private DBHelper dbHelper;
        private SQLiteDatabase sqLiteDatabase;
 
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Toast toast = Toast.makeText(getApplicationContext(),
                    "База даних готова!", Toast.LENGTH_LONG);
            toast.setGravity(Gravity.BOTTOM, 0, 0);
            toast.show();
        }
 
        @Override
        protected Void doInBackground(Void... params) {
            preparationBD();
            saveData();
            return null;
        }
 
        public void preparationBD() {
            dbHelper = new DBHelper(getApplicationContext(), "mydb.db", null, 1);
            sqLiteDatabase = dbHelper.getWritableDatabase();
        }
 
        private void saveData() {
            ContentValues values = new ContentValues();
 
            values.put(dbHelper.NAME_COLUMN, String.valueOf(name));
            values.put(dbHelper.PRICE_COLUMN, Double.valueOf(price.getText().toString()));
            values.put(dbHelper.DESCRIPTION_COLUMN, String.valueOf(description));
            values.put(dbHelper.DATE_COLUMN, "6.30.2015");
            values.put(dbHelper.TYPE_COLUMN, 1);
 
            sqLiteDatabase.insertOrThrow("History", null, values);
        }
    }
 
 
    public void onClick(View view) {
        Log.i("InPutActivity", " onClick ");
 
        switch (view.getId()) {
            case R.id.btnCancel:
                Log.i("InPutActivity", " onClick: btnCancel ");
 
                finish();
                break;
            case R.id.btnAdd:
                Log.i("InPutActivity", " onClick: btnAdd ");
 
                preparationData();
                break;
        }
    }
}


Лог:
Кликните здесь для просмотра всего текста
06-30 22:47:35.959 26352-26402/com.smart_wallet.smartwallet E/SQLiteLog﹕ (1) near "description": syntax error
06-30 22:47:35.962 26352-26402/com.smart_wallet.smartwallet E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
Process: com.smart_wallet.smartwallet, PID: 26352
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:304)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: android.database.sqlite.SQLiteException: near "description": syntax error (code 1): , while compiling: create table History (_id integer not null primary key autoincrement, name text not null, price decimal not null, date text not null, type integer not null description text);
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.executeSql(SQLiteDatabase.java:1674)
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1605)
at com.smart_wallet.smartwallet.db.DBHelper.onCreate(DBHelper.java:46)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
at com.smart_wallet.smartwallet.activity.InPutActivity$ThreadBD.preparationBD(InPutActivity.java:95)
at com.smart_wallet.smartwallet.activity.InPutActivity$ThreadBD.doInBackground(InPutActivity.java:88)
at com.smart_wallet.smartwallet.activity.InPutActivity$ThreadBD.doInBackground(InPutActivity.java:73)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
************at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
************at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
************at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
************at java.lang.Thread.run(Thread.java:818)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2015, 22:51     Создание базы данных
Посмотрите здесь:

Android Вывод из базы данных
Android Шифрование базы данных
Android Выборка данных из Базы с условием
Android - Вывод данных из базы данных Android
Базы данных в андроиде Android
Android Передача данных из базы JSON
Android Чтение данных из базы
Android Инициализация базы данных
Android Создание базы данных в андроид
Android Обновление Базы данных
Создание списка из Базы Android
Удалить таблицу из Базы Данных Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 651
01.07.2015, 01:59     Создание базы данных #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Пропустил запятую
Java
1
2
3
4
5
6
7
8
private static final String CREATE_DATABASE =
            "create table " + TABLE_NAME + " (" + BaseColumns._ID +
                    " integer not null primary key autoincrement, " +
                    NAME_COLUMN + " text not null, " +
                    PRICE_COLUMN + " decimal not null, " +
                    DATE_COLUMN + " text not null, " +
                    TYPE_COLUMN + " integer not null " +//пропущена запятая после null
                    DESCRIPTION_COLUMN + " text);";
PS:
К статическим полям нужно обращаться не через ссылку на объект класса
Java
1
2
3
4
5
6
7
8
9
10
11
private void saveData() {
            ContentValues values = new ContentValues();
 
            values.put(dbHelper.NAME_COLUMN, String.valueOf(name));
            values.put(dbHelper.PRICE_COLUMN, Double.valueOf(price.getText().toString()));
            values.put(dbHelper.DESCRIPTION_COLUMN, String.valueOf(description));
            values.put(dbHelper.DATE_COLUMN, "6.30.2015");
            values.put(dbHelper.TYPE_COLUMN, 1);
 
            sqLiteDatabase.insertOrThrow("History", null, values);
        }
а через название класса
Java
1
2
3
4
5
6
7
8
9
10
11
private void saveData() {
            ContentValues values = new ContentValues();
 
            values.put(DBHelper.NAME_COLUMN, String.valueOf(name));
            values.put(DBHelper.PRICE_COLUMN, Double.valueOf(price.getText().toString()));
            values.put(DBHelper.DESCRIPTION_COLUMN, String.valueOf(description));
            values.put(DBHelper.DATE_COLUMN, "6.30.2015");
            values.put(DBHelper.TYPE_COLUMN, 1);
 
            sqLiteDatabase.insertOrThrow("History", null, values);
        }
banga_ivan
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 10
01.07.2015, 07:47  [ТС]     Создание базы данных #3
Спасибо большое! Все заработало.
Yandex
Объявления
01.07.2015, 07:47     Создание базы данных
Ответ Создать тему
Опции темы

Текущее время: 11:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru