在Android中向SQLite表中插入值

21

我是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个回答

56

将值插入自动递增字段似乎很奇怪。

另外,你尝试过使用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意外停止。- 强制关闭 - Sinoy Devassy
你能调试这个错误吗?它应该在adb logcat中有特定的行号,这样你就可以确定是哪个函数导致了崩溃。 - Jon
我该如何进行调试?我设置了一些断点,但似乎并没有起作用。请问调试的步骤是什么? - Sinoy Devassy
3
每个安卓开发者都应该知道如何使用adb logcat工具。打开终端或命令提示符,导航到您放置/安装安卓SDK文件夹的位置,然后进入其中一个tools、platform-tool或platform-tools文件夹(文件夹名称随时间变化而有所改变)。在其中一个文件夹中,您应该能找到"adb"二进制文件。在与adb二进制文件相同的文件夹中,运行命令adb logcat - Jon
我假设你正在使用Eclipse?如果是这样,你是在问如何在Eclipse中设置断点,还是如何利用adb logcat在Eclipse中处理断点? - Jon
1
值得更多的赞。这是正确的做法。 - Orelsanpls

18

好的,这是完全工作的代码,请根据您的要求进行编辑。

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


我们在此将它作为字符串传递,我该如何通过此查询传递当前日期值。 - Sinoy Devassy
使用系统内置函数获取当前日期 :) - Android
我尝试了这种方法: INSERT INTO CashData (Description,Amount,Trans) VALUES("+a+","+b+","+Trans+") 但插入时出现错误:没有像“a的值”这样的列。 - Sinoy Devassy
db.execSQL("INSERT INTO " + TABLENAME + " VALUES (" + t + ");"); 这里的t是你的变量。 - Android
这样做最终会导致 SQL 注入问题。请改用 db.insert() 方法。 - 101010

3

如果您能捕获从execSQL调用抛出的任何错误,那么您将更容易地找到像这样的调试错误。例如:

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

2

我建议创建一个仅用于插入的方法,然后使用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;
}

1
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


0

好的,你已经使用了 id INTEGER PRIMARY KEY AUTOINCREMENT,但是你仍然在传递值... 这就是问题所在 :) 想要更多细节, 请看这里 如果还存在问题,请发布代码和日志。


你尝试过从插入语句中删除ID值了吗? - Android
你的第一步是先创建一个表,无论它是否被创建成功,然后尝试向其中插入值。 - Android
表已经创建,但是值没有插入,ID已删除,问题仍然存在。 - Sinoy Devassy

0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接