【问题标题】:Inserting values to SQLite table in Android在 Android 中将值插入 SQLite 表
【发布时间】:2011-09-09 05:09:42
【问题描述】:

我是安卓应用开发的新手。我尝试通过以下代码将值插入 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 已意外停止。

已创建数据库和表,但值插入不起作用。 请帮我解决这个问题。 谢谢。

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    在自动递增的字段中插入一个值似乎很奇怪。

    另外,您是否尝试过 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);
    

    【讨论】:

    • 它在模拟器上显示错误-应用程序 CashBook 已意外停止。-强制关闭
    • 你能调试错误吗?它应该在 adb logcat 中有特定的行号,这样您就可以查明哪个函数崩溃了。
    • 如何调试?我放了一些断点..但这不起作用。调试的步骤是什么?
    • 每个Android开发者都应该知道如何使用adb logcat工具。打开终端或命令提示符并导航到放置/安装 android SDK 文件夹的位置,然后进入工具、平台工具或平台工具(文件夹名称已随时间更改)。在其中一个文件夹中,您应该找到“adb”二进制文件。在与 adb 二进制文件相同的文件夹中,运行命令adb logcat
    • 值得更多喜欢。这是正确的方法
    【解决方案2】:

    好的,这是完全工作的代码,根据您的要求编辑它

    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

    【讨论】:

    • 这里我们将它作为字符串传递,我如何通过这个查询传递当前日期值。
    • 使用系统内置函数获取当前日期:)
    • 我试过这个方法:INSERT INTO CashData (Description,Amount,Trans) VALUES("+a+","+b+","+Trans+") 但是插入错误显示:没有这样的列比如“a的价值”
    • db.execSQL("INSERT INTO " + TABLENAME + " VALUES (" + t + ");");这里 t 是你的变量
    • 这是在乞求最终的 SQL 注入问题。请改用 db.insert()。
    【解决方案3】:

    如果您发现从 execSQL 调用中抛出的任何错误,您会发现这样的调试错误要容易得多。例如:

     try 
     {
          db.execSQL(Create_CashBook);  
     }
     catch (Exception e) 
     {
           Log.e("ERROR", e.toString());
     }
    

    【讨论】:

      【解决方案4】:

      我建议创建一个仅用于插入而不是使用 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;
      }
      

      【讨论】:

        【解决方案5】:
        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
                );
         }
        

        }

        然后看这个链接link

        【讨论】:

          【解决方案6】:

          okkk 你有 id INTEGER PRIMARY KEY AUTOINCREMENT 并且你仍然在传递值...... 那就是问题所在 :) 了解更多详情 see this 仍然遇到问题,然后发布代码和 logcat

          【讨论】:

          • 好的,您已经尝试并从插入语句中删除了 id 值?
          • 你首先只是创建一个表,无论它是否创建,然后尝试将值插入其中
          • 表已创建,但值未插入,Id 已删除,pblm 仍然相同
          【解决方案7】:

          由于您是 Android 开发新手,您可能不了解 Content Providers,它们是数据库抽象。它们可能不适合您的项目,但您应该检查一下:http://developer.android.com/guide/topics/providers/content-providers.html

          【讨论】:

            【解决方案8】:

            我看到这是一个旧线程,但我遇到了同样的错误。

            我在这里找到了解释: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

            void execSQL(String sql)
            执行不是 SELECT 的单个 SQL 语句或任何其他返回数据的 SQL 语句。

            void execSQL(String sql, Object[] bindArgs)
            执行不是 SELECT/INSERT/UPDATE/DELETE 的单个 SQL 语句。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-04-14
              • 2012-04-28
              • 1970-01-01
              • 1970-01-01
              • 2016-05-27
              • 1970-01-01
              相关资源
              最近更新 更多