2013-08-16 98 views
1

好的...我很困扰这件事。 我搜索了很多,甚至在这里sackoverflow,但我没有解决我的问题。 事情是:我试图更新我的数据库中的单个列,但它总是出现错误,它不起作用,我甚至不知道问题是什么。我试图使用SQLiteDatabase.update(),不起作用,现在与execSQL(字符串);我试着用SQLiteDatabase.update(),不工作,现在用execSQL(字符串);我试图使用SQLiteDatabase.update(),不工作,现在与execSQL(字符串);同样的错误。Android数据库更新寄存器

因此,我要展示我的代码,并请,如果有人有一些想法是什么问题是...请帮助我。

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) 

,我可以看到错误是空指针异常...但是...我不知道为什么。 .. dataBase上有数据,我很确定,因为我可以在系统中登录,并且密码在dataBase上...所以,我在这里错过了什么?

+0

尝试像这样的分贝。更新(字符串表,ContentValues值,字符串whereClause,字符串[] whereArgs) – Aravin

+0

我也试过这个,但它也不起作用。 这是一个棘手的问题。在ContentValues中,我必须将该键的名称与列名称相同,对吗?而在whereClause只是“'登录'=克里斯蒂亚诺”对吗?是不是,同样的错误... –

+0

我们也可能需要更多信息。你是否使用Android提供者模式(即你是否从ContentProvider扩展)?你是否还使用'SQLiteOpenHelper'来帮助抽象SQLite,使更新和升级更容易? – Tseng

回答

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"); 
    } 
} 

P.S.当以这种方式构建SQL字符串时要小心,它可能容易受到SQL注入攻击。在这个特定的情况下,它“起作用”,因为萨尔多是双重的。但是,如果这将是一个字符串,这是非常危险的,而不逃避,或将字符串''

更新创建的字符串: 也请不要压抑自己的异常输出,这使得跟踪误差更难。

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注入漏洞的风险。

+0

我已经把空间放在哪里...并仍然显示错误... 什么? –

+0

你能告诉我们更多关于错误的信息吗?就像在你的开放文章中添加logcat输出一样?你已经发布了代码,但没有错误,很难猜测它可能会导致它。错误消息对于了解它发生的原因很重要。 – Tseng

+0

你也在压制你的代码中的真正异常。您应该在错误处理中添加'error.printStackTrace()',以便将错误消息打印到logcat窗口而不是被抑制。 – Tseng