1

好的...我很坚持这件事。我已经搜索了很多,即使在 stackoverflow 中,但我没有什么可以解决我的问题。问题是:我正在尝试更新数据库中的单个列,但它总是出错并且不起作用,而且我什至不知道问题出在哪里。

我尝试使用 SQLiteDatabase.update() ,但不起作用,现在使用 execSQL(String); 同样的错误。

所以我要展示我的代码,如果有人知道问题出在哪里......请帮助我。

public void AbreouCriaBD() {
    try {
        String nomeBanco = "Usuarios";
        dataBase = openOrCreateDatabase(nomeBanco, MODE_WORLD_WRITEABLE, null);
        String sql = "CREATE TABLE IF NOT EXISTS usuario" + 
            "(id INTEGER PRIMARY KEY, login TEXT, senha TEXT, saldoBanco float, saldoCredito float, saldoFuturos float)";
            dataBase.execSQL(sql);
    } catch(Exception erro) {
        Alerta("Erro BD","BD Não criado");
    }
}

public void UpdateBDPrincipal(double saldo) {
    String saldoString = String.valueOf(saldo);
    try {
        dataBase.execSQL("UPDATE usuario SET 'saldoBanco'="+ saldoString +"WHERE 'login'= cristiano");
    } catch(Exception error) {
        Alerta("Erro","Erro no UPDATE");
    }
}

public void Alerta(String title,String message) {
    AlertDialog.Builder Sucesso = new AlertDialog.Builder(TelaSaldoCredito.this);
    Sucesso.setTitle(title);
    Sucesso.setMessage(message);
    Sucesso.setNeutralButton("ok", null);
    Sucesso.show();
}

它只是不起作用......请任何东西......

08-16 15:36:24.729: W/System.err(10855): java.lang.NullPointerException
08-16 15:36:24.739: W/System.err(10855): at com.bunchoffat.financejournal.TelaSaldoCredito.UpdateBDPrincipal(TelaSaldoCredito.java:121)
08-16 15:36:24.739: W/System.err(10855): at com.bunchoffat.financejournal.TelaSaldoCredito$1.onClick(TelaSaldoCredito.java:62)
08-16 15:36:24.739: W/System.err(10855): at android.view.View.performClick(View.java:2579)
08-16 15:36:24.739: W/System.err(10855): at android.view.View$PerformClick.run(View.java:9246)
08-16 15:36:24.739: W/System.err(10855): at android.os.Handler.handleCallback(Handler.java:587)
08-16 15:36:24.739: W/System.err(10855): at android.os.Handler.dispatchMessage(Handler.java:92)
08-16 15:36:24.739: W/System.err(10855): at android.os.Looper.loop(Looper.java:130)
08-16 15:36:24.739: W/System.err(10855): at android.app.ActivityThread.main(ActivityThread.java:3735)
08-16 15:36:24.739: W/System.err(10855): at java.lang.reflect.Method.invokeNative(Native Method)
08-16 15:36:24.739: W/System.err(10855): at java.lang.reflect.Method.invoke(Method.java:507)
08-16 15:36:24.759: W/System.err(10855): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
08-16 15:36:24.759: W/System.err(10855): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:662)
08-16 15:36:24.759: W/System.err(10855): at dalvik.system.NativeStart.main(Native Method)

正如我所看到的错误是 NullPointerException ...但是...我不知道为什么...数据库上有数据,我很确定,因为我可以登录系统和密码在数据库上...所以..我在这里缺少什么?

4

1 回答 1

1

您的查询中有错误。添加 saldoString 后,WHERE 语句之前没有空格。

public void UpdateBDPrincipal(double saldo){

    String saldoString = String.valueOf(saldo);
    try{
        dataBase.execSQL("UPDATE usuario SET 'saldoBanco'="+ saldoString +" WHERE 'login'= cristiano");
    } catch(Exception error) {
        Alerta("Erro","Erro no UPDATE");
    }
}

PS 以这种方式构建 SQL 字符串时要小心,它可能容易受到 SQL 注入攻击。在这种特定情况下,它“有效”,因为 saldo 是双重的。但是如果它是一个字符串,那么在不转义或放入字符串的情况下创建字符串是非常危险的''

更新: 另外请不要抑制您的异常输出,这会使跟踪错误变得更加困难。

    try {
    } catch(Exception error) {
        error.printStackTrace(); // Print error to the log
        Alerta("Erro","Erro no UPDATE");
    }

然后使用 logcat 读取 Android 日志。如果您使用 Eclipse 进行调试,则 Logcat 是添加的窗口之一。如果您不使用 Eclipse 或使用它进行测试,请在命令行中运行“adb logcat”(您的智能手机必须通过 USB 连接到您的计算机)。

更新 2: 这是一个关于如何使用 SQLiteOpenHelper 的示例。

public class MyServiceProvider extends ContentProvider {
    private static final String TABLE_NAME = "usuario";
    private SQLiteDatabase db;

    @Override
    public boolean onCreate() {
        // Initialize the database and assign it to the private variable
        MyDatabaseHelper sqlHelper = new MyDatabaseHelper(getContext());
        db = sqlHelper.getReadableDatabase();

        return (db == null)?false:true;
    }

    public void UpdateBDPrincipal(double saldo){

        String saldoString = String.valueOf(saldo);
        try {
            dataBase.execSQL("UPDATE usuario SET 'saldoBanco'="+ saldoString +"WHERE 'login'= cristiano");
        } catch(Exception error) {
            Alerta("Erro","Erro no UPDATE");
        }
    }
}

class MyDatabaseHelper extends SQLiteOpenHelper {
    private static final String LOG_TAG = "MyAppTag";
    private static final String DB_NAME = "Usuarios";
    private static final String TABLE_NAME = "usuario";
    private static final int DATABASE_VERSION = 2;

    public MyDatabaseHelper(Context context){
        super(context, DB_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE IF NOT EXISTS usuario" + 
            "(id INTEGER PRIMARY KEY, login TEXT, senha TEXT, saldoBanco float, saldoCredito float, saldoFuturos float)";
        db.execSQL(sql);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Here you can perform updates when the database structure changes
        // Begin transaction
        db.beginTransaction();

        try {
            if(oldVersion<2){
                // Upgrade database structure from Version 1 to 2
                String alterTable = "ALTER ....";

                db.execSQL(alterTable);
                Log.i(LOG_TAG,"Successfully upgraded to Version 2");
            }

            db.setTransactionSuccessful();
        } catch(Exception ex){
            ex.printStackTrace();
        } finally {
            // Ends transaction
            // If there was an error, the database won't be altered
            db.endTransaction();
        }
    }
}

这样,您就可以清楚地了解数据库的创建和加载以及查询的构建或处理方式(即通过覆盖更新、删除、查询方法)。

编辑: 用法SQLiteDatabase.update()

private String userName = "cristiano";

ContentValues values = new ContentValues();
values.put("saldoBanco", 150.23);

// define the WHERE clause but do not directly concat values into the string
// Use question marks (?) as place holders. 
String whereClause = "WHERE login = ?";

// define a list of args. For each '?' used in WHERE clause, add one element to the array
String[] whereArgs = new String[] { userName };

int numRowsUpdated = db.update(TABLE_NAME, values, whereClause, whereArgs);

执行时,问号将被替换为whereArgs. 第一个问号将被替换为 的第一个元素whereArgs,第二个问号将被第二个元素替换,whereArgs依此类推。

这样,您可以轻松创建 where 子句并避免冒 SQL 注入漏洞的风险。

于 2013-08-16T17:16:00.640 回答