2016-09-26 124 views
-1

問候溢出社區。Android - 從SQL數據庫獲取信息時出現問題

我還是Android開發的新手,所以請耐心等待。 對不起,如果這已經在另一個線程。我找不到任何相關的東西。

通過遵循過去2周的大量教程,我一直在嘗試創建一個應用程序,該應用程序使用下面的4個表格在數據庫上註冊報告。用戶表

2 - - 項目表

3 - 1型項目表

4 - 2型項目表

我的問題是他們的應用程序

1中創建在登錄屏幕中。我試圖在用戶表中搜索我的用戶名/密碼字段以確認用戶訪問。

如果我在表格中找到了我的用戶名/密碼條目,它將在項目表上搜索該用戶已創建的所有項目,並將其返回到下一個活動的列表中。點擊登錄按鈕時,應用程序會在一段時間後凍結並崩潰。你們可以借我一隻手來了解它正在發生什麼嗎?

我的logcat顯示的唯一情況是我有一些SQLiteConnections泄漏,我不知道如何解決......我的數據庫類有點大,所以如果你們需要發佈任何東西以便了解問題,我會稍後發佈。

什麼是gservices.db和networkstatistics.sqlite?

09-26 14:32:40.266 2022-2035/com.google.process.gapps W/SQLiteConnectionPool: A SQLiteConnection object for database '/data/user/0/com.google.android.gsf/databases/gservices.db' was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed. 
09-26 14:33:05.120 2210-2222/com.google.android.gms W/SQLiteConnectionPool: A SQLiteConnection object for database '/data/data/com.google.android.gms/databases/networkstatistics.sqlite' was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed. 

沒有響應的應用程序的方法如下:

public boolean search_access(user user){ 
    String [] tabela_user = new String[]{"username","password"}; 
    String compare_user = "COLUMN_USER_USERNAME = ?"; 
    String [] whereargs = new String[]{user.getUsername()} 


    Cursor cursor = db.query(TABLE_USER, tabela_user, compare_user, null, null, null, null); 

    if(cursor.moveToFirst()) { 
     if(cursor.getString(0).equals(user.getPassword())) { 
      MainActivity.acesso = true; 
     } else{ 
      CharSequence text = "Incorrect Username/Password!!"; 
      int duration = Toast.LENGTH_SHORT; 

      Toast toast = Toast.makeText(null, text, duration); 
      toast.show(); 
      MainActivity.acesso = false; 
     } 
    } 
    return MainActivity.acesso; 
} 

這提供了以下錯誤:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String)' on a null object reference 
        at com.example.relatoriodeobras.projeto_db.busca_acesso(projeto_db.java:177)(which is the cursor line) 

提前感謝!

+0

您應該將數據庫訪問移至新線程。 CursorLoader可以爲此提供幫助。 –

+1

'usuario.getUsername()== username_login' <=它是什麼?這不是我們如何比較java中的字符串...爲什麼你不問db給定的名稱和密碼的用戶數,而是迭代整個表並比較? *應用程序在一段時間後凍結並崩潰* <= prolly ANR – Selvin

+0

好的@代碼學徒,我會嘗試它並尋找CursorLoader。謝謝! – HextechEnthusiast

回答

1

你的代碼對於這類操作實際上太複雜了。 嘗試使用此代碼:

String userName = user.getUsername(); 


Cursor cursor = db.query(TABLE_USER, new String[]{COLUMN_USER_PASSWORD}, "COLUMN_USER_USERNAME = ?", new String[]{userName}, null, null, null, null, null); 

if(cursor.moveToFirst) 
{ 
if(cursor.getString(0).equals(user.getPassword())) MainActivity.acesso = true; 
else{ 
         CharSequence text = "Incorrect Username/Password!!"; 
         int duration = Toast.LENGTH_SHORT; 

         Toast toast = Toast.makeText(null, text, duration); 
         toast.show(); 
         MainActivity.acesso = false; 
       } 
} 
+1

或者,使用query()。 –

+0

我得到空對象引用錯誤'android.database.Cursor android.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String,java.lang.String [])'...這是否意味着它不是接收任何用戶名? – HextechEnthusiast

+0

使用if語句來檢查userName是否等於null。可以使用Log.v()函數來獲取consle中的信息。 –

0

您應該使用query(),而不是rawQuery()。它具有允許您過濾結果的參數。這與SQ查詢中的WHERE子句類似。

更新:

而不是

String compare_user = "COLUMN_USER_USERNAME = " + user.getUsername(); 

你應該做

String compare_user = "COLUMN_USER_USERNAME = ?"; 

然後,你需要提供的第四個參數作爲query()

String user_array = new String[]{user.getUsername()}; 
Cursor cursor = db.query(TABLE_USER, tabela_user, compare_user, user_array, null, null, null); 

當您連接字符串以構建SQL查詢時,可能會面臨SQL注入攻擊的風險。相反,使用?語法將避免此安全漏洞。即使它與您目前的應用程序沒什麼大不了的,現在開始這是一個好習慣。

+0

So ,下面是我嘗試重新排序所做的一切:'String [] tabela_user = new String [] {「username」,「password」};'| 'String compare_user =「COLUMN_USER_USERNAME =」+ user.getUsername();'| '遊標cursor = db。查詢(TABLE_USER,tabela_user,compare_user,null,null,null,null);'|它得到一個空對象引用錯誤。 – HextechEnthusiast

+0

@HextechEnthusiast請編輯您的原始問題或發佈一個新的問題,以便您可以提供可讀格式的代碼。 –

+0

@HextechEnthusiast'String compare_user =「COLUMN_USER_USERNAME =」+ user.getUsername();'應該是'String compare_user =「COLUMN_USER_USERNAME =?」;'爲了避免SQL注入攻擊。然後你需要提供第四個參數給'query()'。 –

相關問題