Android - 从sql数据库获取信息时出现问题

时间:2016-09-26 15:27:08

标签: android sqlite

问候溢出社区。

我仍然是Android开发的新手,所以请耐心等待。 对不起,如果这已经在另一个帖子中了。我无法找到任何相关内容。

通过跟踪过去两周的大量教程,我一直在尝试使用下面的4个表创建一个在数据库上注册报告的应用程序。它们是在应用内创建的

1 - 用户表

2 - 项目表

3 - 类型1项目表

4 - 类型2项目表

我的问题出在登录界面。我试图在用户表中搜索我的用户名/密码字段,以确认用户访问。

如果在表格中找到了我的用户名/密码条目,它将在项目表中搜索该用户已创建的所有项目,并将其返回到下一个活动的列表中。单击登录按钮时,应用程序应该冻结并在一段时间后崩溃。你能帮我一把,了解最新情况吗?

我的logcat唯一显示的是我在某些SQLiteConnections中有泄漏,我不知道如何解决...我的数据库类有点大,所以如果你们需要任何东西按顺序发布为了解这个问题,我稍后会发布。

什么是gservices.db和networkstatistics.sqlite?

appplictionHost.config

冻结应用程序的方法如下:

@SuppressWarnings("TryWithIdenticalCatches")

这会出现以下错误:

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.

提前致谢!

2 个答案:

答案 0 :(得分: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 :(得分: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注入攻击的风险。使用?语法将避免此安全漏洞。即使它对您当前的应用程序来说不是很重要,但现在就开始这是一个好习惯。