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

Ошибка при записи данных в SQLite - Android

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Vlad161
0 / 0 / 0
Регистрация: 02.01.2011
Сообщений: 49
27.10.2013, 17:40     Ошибка при записи данных в SQLite #1
Нужно добавить данные в БД SQLite, добавить нужно только текст. Проект запускается, но при нажатии на кнопку программа падает, в чем беда? И еще почему то не делает ++n и вывод в TextView, делает только 1 раз, в первый раз, дальше 1 счетчик не идет хотя должен.

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
package ru.vlad.keeper;
 
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
 
public class MainActivity extends Activity {
    
    final String LOG_TAG = "myLogs";
 
    TextView tvOut;
    EditText etAdd;
    Button btnKeep;
    ListView listKeep;
 
    DBHelper dbHelper;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        listKeep = (ListView) findViewById(R.id.listKeep);
 
        tvOut = (TextView) findViewById(R.id.tvOut);
 
        etAdd = (EditText) findViewById(R.id.etAdd);
 
        btnKeep = (Button) findViewById(R.id.btnKeep);
        
        btnKeep.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                
              ContentValues cv = new ContentValues();
 
              String text = etAdd.getText().toString();
 
              SQLiteDatabase db = dbHelper.getWritableDatabase();
                
                int n = 0;
              
                tvOut.setText("Btn Activ " + ++n);
                Log.d(LOG_TAG, "--- Insert in mytable: ---");
                
                cv.put("text", text);
                long rowID = db.insert("myTable", null, cv);
                Log.d(LOG_TAG, "row inserted, ID = " + rowID);
                
                
            }
        });
        
    }
   
}
 
 
class DBHelper extends SQLiteOpenHelper {
 
    final String LOG_TAG = "myLogs";
 
    public DBHelper(Context context) {
        super(context, "myDB", null, 1);
    }
 
 
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
 
        SQLiteDatabase db = getWritableDatabase();
 
        Log.d(LOG_TAG, "--- onCreate database ---");
        db.execSQL("create table mytable ("
                + "text" + ");");
 
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
    }
}
Если закоментировать это, то приложение не крашится, но счетчик все равно не считает

Java
1
2
3
4
5
6
7
ContentValues cv = new ContentValues();
String text = etAdd.getText().toString();
SQLiteDatabase db = dbHelper.getWritableDatabase();
 
cv.put("text", text);
long rowID = db.insert("myTable", null, cv);
Log.d(LOG_TAG, "row inserted, ID = " + rowID);

Лог ошибок
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
10-27 09:34:30.737: W/dalvikvm(1202): threadid=1: thread exiting with uncaught exception (group=0x41465700)
10-27 09:34:30.801: E/AndroidRuntime(1202): FATAL EXCEPTION: main
10-27 09:34:30.801: E/AndroidRuntime(1202): java.lang.NullPointerException
10-27 09:34:30.801: E/AndroidRuntime(1202):     at ru.vlad.keeper.MainActivity$1.onClick(MainActivity.java:48)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at android.view.View.performClick(View.java:4240)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at android.view.View$PerformClick.run(View.java:17721)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at android.os.Handler.handleCallback(Handler.java:730)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at android.os.Looper.loop(Looper.java:137)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at android.app.ActivityThread.main(ActivityThread.java:5103)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at java.lang.reflect.Method.invokeNative(Native Method)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at java.lang.reflect.Method.invoke(Method.java:525)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at dalvik.system.NativeStart.main(Native Method)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
27.10.2013, 18:38     Ошибка при записи данных в SQLite #2
dbHelper null. Вы же его нигде не создали.
Vlad161
0 / 0 / 0
Регистрация: 02.01.2011
Сообщений: 49
27.10.2013, 18:51  [ТС]     Ошибка при записи данных в SQLite #3
Цитата Сообщение от YuraAAA Посмотреть сообщение
dbHelper null. Вы же его нигде не создали.
Я новичок в этом. Прошелся опять же глазами по коду, так и не понял как решить проблему. Не могли бы вы по подробней написать что да как. И почему счетчик не работает? Ведь не из за dbHelper
olorin3000
2 / 2 / 1
Регистрация: 27.09.2012
Сообщений: 48
27.10.2013, 19:26     Ошибка при записи данных в SQLite #4
Попробуйте в процедуру onCreate добавить:
dbHelper=new DBHelper(this);
Vlad161
0 / 0 / 0
Регистрация: 02.01.2011
Сообщений: 49
27.10.2013, 22:03  [ТС]     Ошибка при записи данных в SQLite #5
Цитата Сообщение от olorin3000 Посмотреть сообщение
Попробуйте в процедуру onCreate добавить:
dbHelper=new DBHelper(this);
Все равно приложение падает

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
package ru.vlad.keeper;
 
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
 
public class MainActivity extends Activity {
    
    final String LOG_TAG = "myLogs";
 
    TextView tvOut;
    EditText etAdd;
    Button btnKeep;
    ListView listKeep;
 
    DBHelper dbHelper;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        dbHelper = new DBHelper(this);
        
        listKeep = (ListView) findViewById(R.id.listKeep);
 
        tvOut = (TextView) findViewById(R.id.tvOut);
 
        etAdd = (EditText) findViewById(R.id.etAdd);
 
        btnKeep = (Button) findViewById(R.id.btnKeep);
        
        btnKeep.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                
              ContentValues cv = new ContentValues();
 
              String text = etAdd.getText().toString();
 
              SQLiteDatabase db = dbHelper.getWritableDatabase();
                
                int n = 0;
              
                tvOut.setText("Btn Activ " + ++n);
                Log.d(LOG_TAG, "--- Insert in mytable: ---");
                
                cv.put("text", text);
                long rowID = db.insert("myTable", null, cv);
                Log.d(LOG_TAG, "row inserted, ID = " + rowID);
                
                
            }
        });
      
        
        
    }
   
}
 
 
class DBHelper extends SQLiteOpenHelper {
 
    final String LOG_TAG = "myLogs";
 
    public DBHelper(Context context) {
        super(context, "myDB", null, 1);
    }
 
 
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
 
        SQLiteDatabase db = getWritableDatabase();
 
        Log.d(LOG_TAG, "--- onCreate database ---");
        db.execSQL("create table mytable ("
                + "text" + ");");
 
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
    }
}
Добавлено через 5 минут
Собственно ошибки теперь такие
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
10-27 13:57:13.902: W/dalvikvm(824): threadid=1: thread exiting with uncaught exception (group=0x41465700)
10-27 13:57:13.932: E/AndroidRuntime(824): FATAL EXCEPTION: main
10-27 13:57:13.932: E/AndroidRuntime(824): java.lang.IllegalStateException: getDatabase called recursively
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
10-27 13:57:13.932: E/AndroidRuntime(824):  at ru.vlad.keeper.DBHelper.onCreate(MainActivity.java:84)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
10-27 13:57:13.932: E/AndroidRuntime(824):  at ru.vlad.keeper.MainActivity$1.onClick(MainActivity.java:50)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.view.View.performClick(View.java:4240)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.view.View$PerformClick.run(View.java:17721)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.os.Handler.handleCallback(Handler.java:730)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.os.Handler.dispatchMessage(Handler.java:92)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.os.Looper.loop(Looper.java:137)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.app.ActivityThread.main(ActivityThread.java:5103)
10-27 13:57:13.932: E/AndroidRuntime(824):  at java.lang.reflect.Method.invokeNative(Native Method)
10-27 13:57:13.932: E/AndroidRuntime(824):  at java.lang.reflect.Method.invoke(Method.java:525)
10-27 13:57:13.932: E/AndroidRuntime(824):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-27 13:57:13.932: E/AndroidRuntime(824):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-27 13:57:13.932: E/AndroidRuntime(824):  at dalvik.system.NativeStart.main(Native Method)
10-27 13:57:18.793: I/Process(824): Sending signal. PID: 824 SIG: 9
Kiryna
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 11
27.10.2013, 22:27     Ошибка при записи данных в SQLite #6
У Вас при создании таблицы не указано имя столбца, который text
Vlad161
0 / 0 / 0
Регистрация: 02.01.2011
Сообщений: 49
27.10.2013, 23:41  [ТС]     Ошибка при записи данных в SQLite #7
Цитата Сообщение от Kiryna Посмотреть сообщение
У Вас при создании таблицы не указано имя столбца, который text
А как решить эту проблему?
Kiryna
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 11
27.10.2013, 23:59     Ошибка при записи данных в SQLite #8
В данном случае:
название столбца
Java
1
private static final String COLUMN_NAME = "column"
значение

Java
1
cv.put(COLUMN_NAME, text);
и создание таблицы

Java
1
2
db.execSQL("create table mytable ("
                + COLUMN_NAME + "text" + ");");
Кроме того, если планируется использовать Cursor, то нужно еще столбец _id, т.е.

Java
1
2
3
db.execSQL("create table mytable ("
                + "_id" + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + COLUMN_NAME + "text" + ");");
А вообще, стоит почитать уроки по SQLite, и поучится составлять запросы
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
28.10.2013, 20:49     Ошибка при записи данных в SQLite #9
Цитата Сообщение от Vlad161 Посмотреть сообщение
Java
1
2
3
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
SQLiteDatabase db = getWritableDatabase();
зачем вы используете getWritableDatabase если у вас уже есть sqLiteDatabase?
Vlad161
0 / 0 / 0
Регистрация: 02.01.2011
Сообщений: 49
28.10.2013, 22:38  [ТС]     Ошибка при записи данных в SQLite #10
Все равно крашится.

Вот код
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
package ru.vlad.keeper;
 
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
 
public class MainActivity extends Activity {
    
    static final String COLUMN_NAME = "column";
    
    final String LOG_TAG = "myLogs";
 
    TextView tvOut;
    EditText etAdd;
    Button btnKeep;
    ListView listKeep;
 
    DBHelper dbHelper;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        dbHelper = new DBHelper(this);
        
        listKeep = (ListView) findViewById(R.id.listKeep);
 
        tvOut = (TextView) findViewById(R.id.tvOut);
 
        etAdd = (EditText) findViewById(R.id.etAdd);
 
        btnKeep = (Button) findViewById(R.id.btnKeep);
        
        btnKeep.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                
              ContentValues cv = new ContentValues();
 
              String text = etAdd.getText().toString();
 
              SQLiteDatabase db = dbHelper.getWritableDatabase();
                
                int n = 0;
              
                tvOut.setText("Btn Activ " + ++n);
                Log.d(LOG_TAG, "--- Insert in mytable: ---");
                
                cv.put(COLUMN_NAME, text);
                long rowID = db.insert("myTable", null, cv);
                Log.d(LOG_TAG, "row inserted, ID = " + rowID);
                
                
            }
        });
      
        
        
    }
   
}
 
 
class DBHelper extends SQLiteOpenHelper {
 
    final String LOG_TAG = "myLogs";
 
    public DBHelper(Context context) {
        super(context, "myDB", null, 1);
    }
 
 
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
 
        SQLiteDatabase db = getWritableDatabase();
 
        Log.d(LOG_TAG, "--- onCreate database ---");
        db.execSQL("create table mytable ("
                + "_id" + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + MainActivity.COLUMN_NAME + "text" + ");");
 
    }
 
    @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
10-28 14:18:30.508: D/AndroidRuntime(944): Shutting down VM
10-28 14:18:30.508: W/dalvikvm(944): threadid=1: thread exiting with uncaught exception (group=0x41465700)
10-28 14:18:30.538: E/AndroidRuntime(944): FATAL EXCEPTION: main
10-28 14:18:30.538: E/AndroidRuntime(944): java.lang.IllegalStateException: getDatabase called recursively
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
10-28 14:18:30.538: E/AndroidRuntime(944):  at ru.vlad.keeper.DBHelper.onCreate(MainActivity.java:86)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
10-28 14:18:30.538: E/AndroidRuntime(944):  at ru.vlad.keeper.MainActivity$1.onClick(MainActivity.java:52)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.view.View.performClick(View.java:4240)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.view.View$PerformClick.run(View.java:17721)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.os.Handler.handleCallback(Handler.java:730)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.os.Handler.dispatchMessage(Handler.java:92)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.os.Looper.loop(Looper.java:137)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.app.ActivityThread.main(ActivityThread.java:5103)
10-28 14:18:30.538: E/AndroidRuntime(944):  at java.lang.reflect.Method.invokeNative(Native Method)
10-28 14:18:30.538: E/AndroidRuntime(944):  at java.lang.reflect.Method.invoke(Method.java:525)
10-28 14:18:30.538: E/AndroidRuntime(944):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-28 14:18:30.538: E/AndroidRuntime(944):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-28 14:18:30.538: E/AndroidRuntime(944):  at dalvik.system.NativeStart.main(Native Method)
10-28 14:18:34.459: I/Process(944): Sending signal. PID: 944 SIG: 9
Добавлено через 11 минут
Ошибку исправил. Беда была тут:
Вместо этого
Java
1
2
3
 public void onCreate(SQLiteDatabase sqLiteDatabase) {
 
        SQLiteDatabase db = getWritableDatabase();
Надо вот так
Java
1
2
3
 public void onCreate(SQLiteDatabase db) {
 
        //SQLiteDatabase db = getWritableDatabase(); эту строчку удалить
Добавлено через 4 минуты
А вообще понял, что на начальном уровне брать куски кода из уроков и изменять их под себя не лучший вариант. Пошел читать Шилдта - Java полное руководство 8е издание, до БД я еще не дошел.

Всем спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2013, 22:46     Ошибка при записи данных в SQLite
Еще ссылки по теме:

Android Как найти id записи в SQlite таблице при клике на кнопку расположенную в Listview item?
Считывание записанных данных из SQLite Android
Android Ошибка при создании SQLite
Ошибка при считывании с XML и записи в TextEdit Android
Ошибка при записи данных в файл Android

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

Или воспользуйтесь поиском по форуму:
Kiryna
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 11
28.10.2013, 22:46     Ошибка при записи данных в SQLite #11
Цитата Сообщение от Vlad161 Посмотреть сообщение
Ошибку исправил. Беда была тут:
Я бы сказала, и там, и тут. Вот тут короткие уроки по SQLite, для старта, так сказать

Цитата Сообщение от Vlad161 Посмотреть сообщение
А вообще понял, что на начальном уровне брать куски кода из уроков и изменять их под себя не лучший вариант.
Хорошее решение
Yandex
Объявления
28.10.2013, 22:46     Ошибка при записи данных в SQLite
Ответ Создать тему
Опции темы

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