Вставка значений в таблицу SQLite в Android - PullRequest
21 голосов
/ 06 июня 2011

Я новичок в разработке приложений для Android.Я попытался вставить значения в базу данных SQLite с помощью приведенного ниже кода:

public class cashbook extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        SQLiteDatabase db;

        db = openOrCreateDatabase(
            "cashbookdata.db"
            , SQLiteDatabase.CREATE_IF_NECESSARY
            , null
            );

        final String Create_CashBook =
            "CREATE TABLE CashData ("
            + "id INTEGER PRIMARY KEY AUTOINCREMENT,"
            + "Description TEXT," 
            + "Amount REAL,"
            + "Trans INTEGER," 
            + "EntryDate TEXT);";

        db.execSQL(Create_CashBook);  
        final String Insert_Data="INSERT INTO CashData VALUES(2,'Electricity',500,1,'04/06/2011')";
        db.execSQL(Insert_Data);

Это показывает ошибку на эмуляторе - Приложение CashBook неожиданно остановилось.

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

Ответы [ 8 ]

54 голосов
/ 06 июня 2011

Кажется странным вставлять значение в автоматически увеличивающееся поле.

Кроме того, вы пытались использовать метод insert () вместо execSQL?

ContentValues insertValues = new ContentValues();
insertValues.put("Description", "Electricity");
insertValues.put("Amount", 500);
insertValues.put("Trans", 1);
insertValues.put("EntryDate", "04/06/2011");
db.insert("CashData", null, insertValues);
17 голосов
/ 06 июня 2011

okk, это полностью рабочий код, отредактируйте его в соответствии с вашими требованиями

public class TestProjectActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    SQLiteDatabase db;
    db = openOrCreateDatabase( "Temp.db"        , SQLiteDatabase.CREATE_IF_NECESSARY        , null          );
    try {
        final String CREATE_TABLE_CONTAIN = "CREATE TABLE IF NOT EXISTS tbl_Contain ("
                + "ID INTEGER primary key AUTOINCREMENT,"
                + "DESCRIPTION TEXT,"
                + "expirydate DATETIME,"
                + "AMOUNT TEXT,"
                + "TRNS TEXT," + "isdefault TEXT);";
        db.execSQL(CREATE_TABLE_CONTAIN);
        Toast.makeText(TestProjectActivity.this, "table created ", Toast.LENGTH_LONG).show();
        String sql =
            "INSERT or replace INTO tbl_Contain (DESCRIPTION, expirydate, AMOUNT, TRNS,isdefault) VALUES('this is','03/04/2005','5000','tran','y')" ;       
                db.execSQL(sql);
    }
    catch (Exception e) {
        Toast.makeText(TestProjectActivity.this, "ERROR "+e.toString(), Toast.LENGTH_LONG).show();  
}}}

Надеюсь, это полезно для вас ..
не используйте TEXT для поля даты, возможно, проблема с обсадной колонной еще не полученапроблема, дайте мне знать:) Pragna

3 голосов
/ 06 июня 2011

Вы найдете ошибки отладки, подобные этой, намного проще, если поймаете любые ошибки, вызванные вызовом execSQL. например:

 try 
 {
      db.execSQL(Create_CashBook);  
 }
 catch (Exception e) 
 {
       Log.e("ERROR", e.toString());
 }
1 голос
/ 06 июня 2011
public class TestingData extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    SQLiteDatabase db;
    db = openOrCreateDatabase(
        "TestingData.db"
        , SQLiteDatabase.CREATE_IF_NECESSARY
        , null
        );
 }

}

тогда смотрите эту ссылку ссылку

0 голосов
/ 05 июля 2018

Рекомендую создать метод только для вставки, а затем использовать ContentValues. Для дальнейшей информации https://www.tutorialspoint.com/android/android_sqlite_database.htm

public boolean insertToTable(String DESCRIPTION, String AMOUNT, String TRNS){

    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues contentValues = new ContentValues();
    contentValues.put("this is",DESCRIPTION);
    contentValues.put("5000",AMOUNT);
    contentValues.put("TRAN",TRNS);
    db.insert("Your table name",null,contentValues);

    return true;
}
0 голосов
/ 14 мая 2014

Я вижу, что это старый поток, но у меня была та же ошибка.

Я нашел объяснение здесь: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

void execSQL(String sql)
Выполнить одинОператор SQL, который НЕ является SELECT, или любой другой оператор SQL, который возвращает данные.

void execSQL(String sql, Object[] bindArgs)
Выполнение одного оператора SQL, который НЕ является SELECT / INSERT / UPDATE / DELETE.

0 голосов
/ 06 июня 2011

Поскольку вы новичок в разработке для Android, вы можете не знать о контент-провайдерах, которые являются абстракциями базы данных. Они могут не подходить для вашего проекта, но вы должны проверить их: http://developer.android.com/guide/topics/providers/content-providers.html

0 голосов
/ 06 июня 2011

okkk у вас есть идентификатор INTEGER PRIMARY KEY AUTOINCREMENT и вы все еще передаете значение ... это проблема :) для более подробной информации посмотрите на это все еще возникают проблемы, затем отправьте код и logcat

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...