2016-09-26 60 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()'。 –

相关问题