我怎么知道 sqlite 是否在我的应用程序上运行?
How can I know if sqlite is working on my app?
我目前正在用 sqlite 玩井字游戏,以允许 sqlite 保存用户名以及玩游戏的人的姓名和姓氏,但如果用户名已经存在,应用程序将启动井字游戏,事情是,当我注册一个用户名时,如果我退出游戏并尝试使用相同的用户名进入,它会再次将我发送到注册表格(再次写下我的名字和姓氏)。
我的项目是在 android studio (KitKat 4.4) 中用 API 19 制作的 我不知道这是否是 sqlite 避免插入数据的原因。
这是 sqlite 的代码:
DBHelper.java:
public class DbHelper extends SQLiteOpenHelper {
private static final String DB_NAME="GatoBD.sqlite";
private static final int DB_SCHEME_VERSION=1;
public DbHelper(Context context) {
super(context, DB_NAME, null, DB_SCHEME_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DataBaseManager.CREATE_1_TABLE);
// db.execSQL(DataBaseManager.CREATE_2_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
DataBaseManager.java:
public class DataBaseManager {
public static String TABLE_1_NAME ="Users";
public static String TABLE_2_NAME="Points";
public static final String CN_ID = "_id";
public static final String CN_NAME = "name";
public static final String CN_1_LASTNAME = "last name";
public static final String CN_1_USER = "user";
public static final String CN_2_SCORE = "points";
public static final String CN_2_TIME = "time";
public static final String CREATE_1_TABLE = "create table "+TABLE_1_NAME+ "("//Tabla de usuarios
+ CN_ID + " integer primary key autoincrement,"
+CN_NAME + " text,"
+CN_1_LASTNAME + "text,"
+CN_1_USER +" text);";
public static final String CREATE_2_TABLE = "create table " + TABLE_2_NAME + " ("//Tabla de puntajes
+ CN_ID + " integer primary key autoincrement,"
+CN_1_USER + " text not null,"
+CN_2_SCORE +" integer);"
+CN_2_TIME +" text);";
private DbHelper helper;
private SQLiteDatabase db1;
public DataBaseManager(Context context) {
helper=new DbHelper(context);
db1=helper.getWritableDatabase();
}
public boolean ItsEmpty()
{
String columns[]={CN_ID ,CN_NAME ,CN_1_LASTNAME ,CN_1_USER };
Cursor cursor = db1.query(TABLE_1_NAME, columns, null, null, null, null,null);
if(cursor.getCount()>0)
{
return false; // database not empty
} else {
return true; // database empty
}
}
public ContentValues generateContentValues(String name, String lastname, String user) //
{
ContentValues values=new ContentValues();
valores.put("name",name);
valores.put("last name",lastname);
valores.put("user",user);
return values;
}
public void InsertNewUser(String name, String lastname, String user)
{
db1.insert("Users",null, generateContentValues(name,lastname,user) );
db1.close();
}
public boolean SearchUser(String user)
{
String countQuery = "SELECT * FROM " + TABLE_1_NAME;
Cursor c = db1.rawQuery(countQuery, null);
if (!ItsEmpty())
{
c.moveToFirst();
do {
if (user.equals(c.getString(c.getColumnIndex("user"))))
{
c.close();
return true;
}
}
while (c.moveToNext());
}
c.close();
return false;
}
您在 Users CREATE TABLE 中有几个错误,这将使插入内容被忽略(连同其他潜在的 issues/crashes)
首先是你用的是列名last name,不括起来会导致列名被称为last 并在结果 SQL 出现时出现语法错误 姓氏 逗号不在两者之间(就 SQL 而言)列名称。
我建议修改:-
public static final String CN_1_LASTNAME = "last name";
至:-
public static final String CN_1_LASTNAME = "lastname";
如果您坚持 space 则以下之一:-
public static final String CN_1_LASTNAME = "`last name`";
public static final String CN_1_LASTNAME = "[last name]";
public static final String CN_1_LASTNAME = "'last name'";
public static final String CN_1_LASTNAME = "\"last name\"";
确保您始终使用 CN_1_LASTNAME
引用列名。
第二个问题再次与 last name 列有关,因为它与列类型 TEXT[=47] 之间没有 space =].因此,如果应用上述修复,该列将再次命名为 lastnameTEXT,从而导致问题。
解决这个问题的方法是更改:-
+CN_1_LASTNAME + "text,"
成为:-
+CN_1_LASTNAME + " text," //<<<< ADDED SPACE before text.
修改完代码后,您需要删除数据库(假设数据库中没有重要数据)(删除数据库是重建数据库的最简单方法)。
您可以通过以下任一方式执行此操作:-
- 删除应用程序的数据或
- 卸载应用程序。
然后重新运行应用程序。
关于了解数据库中的内容,您可能会发现以下内容很有用:-
我目前正在用 sqlite 玩井字游戏,以允许 sqlite 保存用户名以及玩游戏的人的姓名和姓氏,但如果用户名已经存在,应用程序将启动井字游戏,事情是,当我注册一个用户名时,如果我退出游戏并尝试使用相同的用户名进入,它会再次将我发送到注册表格(再次写下我的名字和姓氏)。 我的项目是在 android studio (KitKat 4.4) 中用 API 19 制作的 我不知道这是否是 sqlite 避免插入数据的原因。 这是 sqlite 的代码:
DBHelper.java:
public class DbHelper extends SQLiteOpenHelper {
private static final String DB_NAME="GatoBD.sqlite";
private static final int DB_SCHEME_VERSION=1;
public DbHelper(Context context) {
super(context, DB_NAME, null, DB_SCHEME_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DataBaseManager.CREATE_1_TABLE);
// db.execSQL(DataBaseManager.CREATE_2_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
DataBaseManager.java:
public class DataBaseManager {
public static String TABLE_1_NAME ="Users";
public static String TABLE_2_NAME="Points";
public static final String CN_ID = "_id";
public static final String CN_NAME = "name";
public static final String CN_1_LASTNAME = "last name";
public static final String CN_1_USER = "user";
public static final String CN_2_SCORE = "points";
public static final String CN_2_TIME = "time";
public static final String CREATE_1_TABLE = "create table "+TABLE_1_NAME+ "("//Tabla de usuarios
+ CN_ID + " integer primary key autoincrement,"
+CN_NAME + " text,"
+CN_1_LASTNAME + "text,"
+CN_1_USER +" text);";
public static final String CREATE_2_TABLE = "create table " + TABLE_2_NAME + " ("//Tabla de puntajes
+ CN_ID + " integer primary key autoincrement,"
+CN_1_USER + " text not null,"
+CN_2_SCORE +" integer);"
+CN_2_TIME +" text);";
private DbHelper helper;
private SQLiteDatabase db1;
public DataBaseManager(Context context) {
helper=new DbHelper(context);
db1=helper.getWritableDatabase();
}
public boolean ItsEmpty()
{
String columns[]={CN_ID ,CN_NAME ,CN_1_LASTNAME ,CN_1_USER };
Cursor cursor = db1.query(TABLE_1_NAME, columns, null, null, null, null,null);
if(cursor.getCount()>0)
{
return false; // database not empty
} else {
return true; // database empty
}
}
public ContentValues generateContentValues(String name, String lastname, String user) //
{
ContentValues values=new ContentValues();
valores.put("name",name);
valores.put("last name",lastname);
valores.put("user",user);
return values;
}
public void InsertNewUser(String name, String lastname, String user)
{
db1.insert("Users",null, generateContentValues(name,lastname,user) );
db1.close();
}
public boolean SearchUser(String user)
{
String countQuery = "SELECT * FROM " + TABLE_1_NAME;
Cursor c = db1.rawQuery(countQuery, null);
if (!ItsEmpty())
{
c.moveToFirst();
do {
if (user.equals(c.getString(c.getColumnIndex("user"))))
{
c.close();
return true;
}
}
while (c.moveToNext());
}
c.close();
return false;
}
您在 Users CREATE TABLE 中有几个错误,这将使插入内容被忽略(连同其他潜在的 issues/crashes)
首先是你用的是列名last name,不括起来会导致列名被称为last 并在结果 SQL 出现时出现语法错误 姓氏 逗号不在两者之间(就 SQL 而言)列名称。
我建议修改:-
public static final String CN_1_LASTNAME = "last name";
至:-
public static final String CN_1_LASTNAME = "lastname";
如果您坚持 space 则以下之一:-
public static final String CN_1_LASTNAME = "`last name`";
public static final String CN_1_LASTNAME = "[last name]";
public static final String CN_1_LASTNAME = "'last name'";
public static final String CN_1_LASTNAME = "\"last name\"";
确保您始终使用 CN_1_LASTNAME
引用列名。
第二个问题再次与 last name 列有关,因为它与列类型 TEXT[=47] 之间没有 space =].因此,如果应用上述修复,该列将再次命名为 lastnameTEXT,从而导致问题。
解决这个问题的方法是更改:-
+CN_1_LASTNAME + "text,"
成为:-
+CN_1_LASTNAME + " text," //<<<< ADDED SPACE before text.
修改完代码后,您需要删除数据库(假设数据库中没有重要数据)(删除数据库是重建数据库的最简单方法)。
您可以通过以下任一方式执行此操作:- - 删除应用程序的数据或 - 卸载应用程序。 然后重新运行应用程序。
关于了解数据库中的内容,您可能会发现以下内容很有用:-