【问题标题】:How can I know if sqlite is working on my app?我怎么知道 sqlite 是否在我的应用程序上运行?
【发布时间】:2018-04-14 08:32:01
【问题描述】:

我目前正在使用 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;
}

【问题讨论】:

标签: android sqlite android-4.4-kitkat


【解决方案1】:

您在 Users CREATE TABLE 中有几个错误,这将导致插入被忽略(以及其他潜在问题/崩溃)

第一个是你使用了一个列名last name,它没有被括起来会导致列名被称为last,并在生成SQL时出现语法错误出现在 last name 逗号不在两个(就 SQL 而言)列名之间。

我建议修改:-

public static final String CN_1_LASTNAME = "last name";

到:-

public static final String CN_1_LASTNAME = "lastname";

如果您坚持使用空格,则选择以下之一:-

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 之间没有空格。因此,如果应用了上述修复,该列将再次命名为 lastnameTEXT,从而导致问题。

解决方法是改变:-

+CN_1_LASTNAME + "text,"

成为:-

+CN_1_LASTNAME + " text," //<<<< ADDED SPACE before text.

修改代码后,您需要删除数据库(假设数据库中没有重要数据)(删除数据库是重建数据库的最简单方法)。

您可以通过以下任一方式执行此操作:- - 删除应用程序的数据或 - 卸载应用程序。 然后重新运行应用程序。

关于了解数据库中的内容,您可能会发现以下有用的信息:- Are there any methods that assist with resolving common SQLite issues?

【讨论】:

  • 非常感谢,您抽出宝贵时间来回答,效果很好:D
  • @SebasSilva 我很高兴。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
相关资源
最近更新 更多