SQLite 语法错误代码 1,尝试修复但修复无济于事



构建成功,但当我试图通过myDataBaseManager.openDataBase()打开我的数据库时,应用程序崩溃并附上下面的错误

有一个崩溃日志:

FATAL EXCEPTION: 
main Process: com.example.smartwardrobe, PID: 9535                                                                                                 
java.lang.RuntimeException: Unable to resume activity 
{com.example.smartwardrobe/com.example.smartwardrobe.LoginActivity}: 
android.database.sqlite.SQLiteException: near "myTableOfClothes": syntax 
error (code 1 SQLITE_ERROR): , while compiling: myTableOfClothes

有一个类是用来构建数据库的:


public final class MyDataBaseContract {
public static final String USER_TABLE_NAME = "usersMyTable";
public static final String USER_ID = "userID";
public static final String USER_LOGIN = "login";
public static final String USER_PASSWORD = "password";
public static final String CLOTHE_TABLE_NAME = "clothesMyTable";
public static final String CLOTHE_COLOUR = "clothe_Colour";
public static final String CLOTHE_WARMTH = "clotheWarmth";
public static final String CLOTHE_TYPE = "clotheType";
public static final String CLOTHE_NAME = "clotheName";
public static final String CLOTHE_IMAGE_INDEX = "clotheImageIndex";
public static final String CLOTHE_OWNER_ID = "ownerId";
public static final String CLOTHE_ID = "clotheID";
public static final String DATABASE_NAME = "wardrobeDatabase.db";
public static final int DB_VERSION = 1;
public static final String USER_TABLE_STRUCTURE = "CREATE TABLE IF NOT EXISTS " +
USER_TABLE_NAME + " (" + USER_ID + " INTEGER PRIMARY KEY," + USER_LOGIN + " TEXT," +
USER_PASSWORD + " TEXT)";
public static final String CLOTHE_TABLE_STRUCTURE = "CREATE TABLE IF NOT EXISTS " +
CLOTHE_TABLE_NAME + " (" + CLOTHE_ID + " INTEGER PRIMARY KEY," + CLOTHE_COLOUR + " TEXT," +
CLOTHE_WARMTH + " TEXT," + CLOTHE_TYPE + " TEXT," + CLOTHE_NAME + " TEXT," +  CLOTHE_IMAGE_INDEX + " TEXT," +
CLOTHE_OWNER_ID + " TEXT)";
public static final String DROP_CLOTHE_TABLE = "DROP TABLE IF EXIST " + CLOTHE_TABLE_NAME;
public static final String DROP_USER_TABLE = "DROP TABLE IF EXIST " + USER_TABLE_NAME;
}

存在MyDataBaseManager类:

@SuppressLint("Range")
public class MyDataBaseManager {
private Context context;
private MyDataBaseHelper myDataBaseHelper;
private SQLiteDatabase database;
public MyDataBaseManager(Context context) {
this.context = context;
myDataBaseHelper = new MyDataBaseHelper(context);
}
public void openDataBase(){
database = myDataBaseHelper.getWritableDatabase();
}
public void closeDataBase(){
myDataBaseHelper.close();
}
public void insertUserToUserDataBase(String login, String password){
ContentValues cv = new ContentValues();
cv.put(MyDataBaseContract.USER_LOGIN, login);
cv.put(MyDataBaseContract.USER_PASSWORD, password);
database.insert(MyDataBaseContract.USER_TABLE_NAME, null, cv);
}
public void insertClotheToClotheDatabase(String type, String warmth, String colour,
String name, int ownerId){
ContentValues cv = new ContentValues();
cv.put(MyDataBaseContract.CLOTHE_TYPE, type);
cv.put(MyDataBaseContract.CLOTHE_WARMTH, warmth);
cv.put(MyDataBaseContract.CLOTHE_COLOUR, colour);
cv.put(MyDataBaseContract.CLOTHE_NAME, name);
cv.put(MyDataBaseContract.CLOTHE_OWNER_ID, ownerId);
database.insert(MyDataBaseContract.CLOTHE_TABLE_NAME, null, cv);
}

public ArrayList<Clothe> getAllClothesByOwnerId(int ownerId){
Cursor cursor = database.query(MyDataBaseContract.CLOTHE_TABLE_NAME,
null, null, null,
null, null, null);
ArrayList<Clothe> clothes = new ArrayList<>();
while (cursor.moveToNext()){
if(ownerId == cursor.getInt(cursor.getColumnIndex(MyDataBaseContract.CLOTHE_OWNER_ID))){
Clothe clothe = new Clothe(
cursor.getInt(cursor.getColumnIndex(MyDataBaseContract.CLOTHE_ID)),//Clothe ID
cursor.getString(cursor.getColumnIndex(MyDataBaseContract.CLOTHE_WARMTH)), //Clothe warmth
cursor.getString(cursor.getColumnIndex(MyDataBaseContract.CLOTHE_TYPE)), // Clothe type
cursor.getString(cursor.getColumnIndex(MyDataBaseContract.CLOTHE_COLOUR)), //Clothe colour
cursor.getString(cursor.getColumnIndex(MyDataBaseContract.CLOTHE_NAME)), //Clothe name
cursor.getInt(cursor.getColumnIndex(MyDataBaseContract.CLOTHE_OWNER_ID))); //Owner ID
clothes.add(clothe);
}
}
cursor.close();
return clothes;
}
public boolean doesLoginExist(String login){
Cursor cursor = database.query(MyDataBaseContract.USER_TABLE_NAME,
null, null, null,
null, null, null);
while (cursor.moveToNext()){
if(login.equals(cursor.getString(cursor.getColumnIndex(MyDataBaseContract.USER_LOGIN))))
{
cursor.close();
return true;
};
}
cursor.close();
return false;
}
public User getUserByLogin(String login){
if (!doesLoginExist(login)) return null;
Cursor cursor = database.query(MyDataBaseContract.USER_TABLE_NAME,
null, null, null,
null, null, null);
while (cursor.moveToNext()){
if(login.equals(cursor.getString(cursor.getColumnIndex(MyDataBaseContract.USER_LOGIN)))){
User user = new User(login, cursor.getString(cursor.getColumnIndex(MyDataBaseContract.USER_PASSWORD)),
cursor.getInt(cursor.getColumnIndex(MyDataBaseContract.USER_ID)));
cursor.close();
return user;
}
}
cursor.close();
return null;
}
public User getUserByID(int userID){
Cursor cursor = database.query(MyDataBaseContract.USER_TABLE_NAME,
null, null, null,
null, null, null);
while (cursor.moveToNext()){
if (userID == cursor.getInt(cursor.getColumnIndex(MyDataBaseContract.USER_ID))){
User user = new User(cursor.getString(cursor.getColumnIndex(MyDataBaseContract.USER_LOGIN)),
cursor.getString(cursor.getColumnIndex(MyDataBaseContract.USER_PASSWORD)),
cursor.getInt(cursor.getColumnIndex(MyDataBaseContract.USER_ID)));
cursor.close();
return user;
}
}
return null;
}
}

还有一个使用myDataBaseManager.openDataBase()的类:

public class LoginActivity extends AppCompatActivity {
private MyDataBaseManager myDataBaseManager;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//Buttons
Button btn_login = findViewById(R.id.btn_LoginPage_SignIn);
Button btn_register = findViewById(R.id.btn_LoginPage_OpenRegisterDialog);
//Edit Texts
EditText et_login = findViewById(R.id.et_LoginPage_Login);
EditText et_password = findViewById(R.id.et_LoginPage_Password);
//Other
myDataBaseManager = new MyDataBaseManager(this);
Activity activity = this;
btn_register.setOnClickListener(v -> startRegistration(activity, myDataBaseManager));
btn_login.setOnClickListener(v -> {
String login = et_login.getText().toString();
if (myDataBaseManager.doesLoginExist(login)){
User tempUser = myDataBaseManager.getUserByLogin(login);
String password = et_password.getText().toString();
if(tempUser.getPassword().equals(password)){
Intent intent = new Intent(activity, MainActivity.class);
intent.putExtra("UserID", tempUser.getUserID());
startActivity(intent);
myDataBaseManager.closeDataBase();
finishActivity(0);
}
else
Toast.makeText(activity, "Password is incorrect. Check it and try again", Toast.LENGTH_SHORT).show();
}
else Toast.makeText(activity, "User with this login does not exist. Sign up!(^_^)", Toast.LENGTH_SHORT).show();
});
}
@Override
protected void onResume() {
super.onResume();
myDataBaseManager.openDataBase();
}

我检查了我的代码几次,搜索数据库语法错误或其他类错误,但没有发现任何东西。

附加信息:虚拟设备:Pixel 6 pro API 33

具体的错误是"myTableOfClothes"是不正确的。似乎你正在尝试创建一个表的名称,但它不存在于你共享的代码,似乎表名可能拼写错误,或者它不是正确的表名,你正在尝试创建。

请检查您要创建的表的名称,并检查您是否使用了正确的SQL语句来创建表。在您共享的代码中,这个表名为"clothesmytable"。在MyDataBaseContract类中,创建它的语句叫做CLOTHE_TABLE_STRUCTURE。

另外,请确保表尚未创建,并且您正在尝试再次创建它,如果是这样,您应该在使用DROP_CLOTHE_TABLE语句再次创建它之前先删除它。

同样重要的是要注意,如果您在SQL语句中使用硬编码字符串字面量,请确保使用正确的表名和列名。

public static final String CLOTHE_TABLE_NAME = "clothesMyTable"

public static final String CLOTHE_TABLE_STRUCTURE = "创建表如果不存在"+CLOTHE_TABLE_NAME + "(";+ CLOTHE_ID + "整数主键,"+ clothe_color + "文本,"+clothe_warm + "文本,"+ CLOTHE_TYPE + "文本,"+ CLOTHE_NAME + "文本,"+ CLOTHE_IMAGE_INDEX "文本,"+CLOTHE_OWNER_ID + ">

文本)";;此外,您需要更新代码中使用的表名,以匹配正确的表名。

另外,确保使用正确的SQL

最新更新