Java Android中的SQLite问题;没有这样的表格”;错误
我在stack overflow中搜索过类似的问题,但在我的问题上,它们似乎都不适用或有效。我有一个创建SQLite数据库的应用程序,当涉及到表“LOGIN”时,它是完全可用的,但其他一切都会使应用程序崩溃。我的数据库由用户以及用户可以创建的项目和任务组成,因此,当我尝试列出特定用户完成的每个项目时,我会得到一个“没有这样的表”错误,即使该表绝对存在并且可以使用登录。我起初以为缓存中还有一个旧数据库,但我尝试过两次在出厂时重置设备,这会清除整个数据库,但错误仍然存在。怎么了 数据库帮助程序:Java Android中的SQLite问题;没有这样的表格”;错误,java,android,sql,sqlite,Java,Android,Sql,Sqlite,我在stack overflow中搜索过类似的问题,但在我的问题上,它们似乎都不适用或有效。我有一个创建SQLite数据库的应用程序,当涉及到表“LOGIN”时,它是完全可用的,但其他一切都会使应用程序崩溃。我的数据库由用户以及用户可以创建的项目和任务组成,因此,当我尝试列出特定用户完成的每个项目时,我会得到一个“没有这样的表”错误,即使该表绝对存在并且可以使用登录。我起初以为缓存中还有一个旧数据库,但我尝试过两次在出厂时重置设备,这会清除整个数据库,但错误仍然存在。怎么了 数据库帮助程序: p
package com.example.tasksketchgui;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DataBaseHelper extends SQLiteOpenHelper
{
public DataBaseHelper(Context context, String name,CursorFactory factory, int version)
{
super(context, name, factory, version);
}
// Called when no database exists in disk and the helper class needs
// to create a new one.
@Override
public void onCreate(SQLiteDatabase _db)
{
_db.execSQL(LoginDataBaseAdapter.DATABASE_CREATE);
}
// Called when there is a database version mismatch meaning that the version
// of the database on disk needs to be upgraded to the current version.
@Override
public void onUpgrade(SQLiteDatabase _db, int _oldVersion, int _newVersion)
{
// Log the version upgrade.
Log.w("TaskDBAdapter", "Upgrading from version " +_oldVersion + " to " +_newVersion + ", which will destroy all old data");
// Upgrade the existing database to conform to the new version. Multiple
// previous versions can be handled by comparing _oldVersion and _newVersion
// values.
// The simplest case is to drop the old table and create a new one.
_db.execSQL("DROP TABLE IF EXISTS " + "TEMPLATE");
// Create a new one.
onCreate(_db);
}
}
这里有一个适配器,我用它来访问数据库
package com.example.tasksketchgui;
import java.util.ArrayList;
import java.util.List;
import com.example.tasksketchgui.sqlite.model.ProjectEntry;
import com.example.tasksketchgui.sqlite.model.UserEntry;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
public class LoginDataBaseAdapter
{
static final String DATABASE_NAME = "login.db";
static final int DATABASE_VERSION = 1;
public static final int NAME_COLUMN = 1;
// TODO: Create public field for each column in your table.
//Column for all tables
static final String KEY_ID = "_id";
static final String KEY_NAME = "name";
static final String KEY_DEADLINE = "deadline";
static final String KEY_USER_ID = "user_id";
static final String KEY_PROJECT_ID = "project_id";
//Column names for login
static final String KEY_USER_PASSWORD = "PASSWORD";
static final String KEY_USER_NAME = "USERNAME";
//Column names for user_task
static final String KEY_TASK_ID = "task_id";
//Table names
static final String TABLE_PROJECT = "projects";
static final String TABLE_TASK = "tasks";
static final String TABLE_TASK_USER = "task_user";
static final String TABLE_PROJECT_USER = "project_user";
//Create table for projects
static final String CREATE_TABLE_PROJECT = "CREATE TABLE IF NOT EXISTS " + TABLE_PROJECT + " ("
+ KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_NAME + " TEXT, "
+ KEY_DEADLINE + " TEXT, " + KEY_USER_ID + " INTEGER" + ") ;";
//Create table for tasks
static final String CREATE_TABLE_TASK = "CREATE TABLE IF NOT EXISTS " + TABLE_TASK + " ("
+ KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_NAME + " TEXT, "
+ KEY_PROJECT_ID + " INTEGER, " + KEY_DEADLINE + " DATETIME" + ") ;";
//Create table for taskUsers
static final String CREATE_TABLE_TASK_USER = "CREATE TABLE IF NOT EXISTS " + TABLE_TASK_USER + " ("
+ KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+ KEY_TASK_ID +
" INTEGER, " + KEY_USER_ID + "INTEGER" + ") ;";
//Create table for projectUsers
static final String CREATE_TABLE_PROJECT_USER = "CREATE TABLE IF NOT EXISTS " + TABLE_PROJECT_USER + " ("
+ KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_PROJECT_ID + " INTEGER, "
+ KEY_USER_ID + " INTEGER" + ") ;";
// SQL Statement to create a new database.
static final String DATABASE_CREATE = "create table IF NOT EXISTS "+"LOGIN"+
"( " +"ID"+" integer primary key autoincrement,"+ "USERNAME text,PASSWORD text); "
+ CREATE_TABLE_PROJECT + "; " + CREATE_TABLE_TASK + ";" + CREATE_TABLE_TASK_USER
+ ";" + CREATE_TABLE_PROJECT_USER + ";";
// Variable to hold the database instance
public SQLiteDatabase db;
// Context of the application using the database.
private final Context context;
// Database open/upgrade helper
private DataBaseHelper dbHelper;
public LoginDataBaseAdapter(Context _context)
{
context = _context;
dbHelper = new DataBaseHelper(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public LoginDataBaseAdapter open() throws SQLException
{
db = dbHelper.getWritableDatabase();
return this;
}
public void close()
{
db.close();
}
public SQLiteDatabase getDatabaseInstance()
{
return db;
}
public void insertEntry(UserEntry user)
{
ContentValues newValues = new ContentValues();
// Assign values for each row.
newValues.put("USERNAME", user.getUserName());
newValues.put("PASSWORD", user.getPassword());
db.insert("LOGIN", null, newValues);
///Toast.makeText(context, "Reminder Is Successfully Saved", Toast.LENGTH_LONG).show();
}
public void insertEntry(String userName,String password)
{
ContentValues newValues = new ContentValues();
// Assign values for each row.
newValues.put("USERNAME", userName);
newValues.put("PASSWORD",password);
db.insert("LOGIN", null, newValues);
///Toast.makeText(context, "Reminder Is Successfully Saved", Toast.LENGTH_LONG).show();
}
public int deleteUser(String UserName)
{
//String id=String.valueOf(ID);
String where="USERNAME=?";
int numberOFEntriesDeleted= db.delete("LOGIN", where, new String[]{UserName}) ;
// Toast.makeText(context, "Number fo Entry Deleted Successfully : "+numberOFEntriesDeleted, Toast.LENGTH_LONG).show();
return numberOFEntriesDeleted;
}
public String getSinlgeUserPassword(String userName)
{
Cursor cursor=db.query("LOGIN", null, " USERNAME=?", new String[]{userName}, null, null, null);
if(cursor.getCount()<1) // UserName Not Exist
{
cursor.close();
return "NOT EXIST";
}
cursor.moveToFirst();
String password= cursor.getString(cursor.getColumnIndex("PASSWORD"));
cursor.close();
return password;
}
//Returns all users in the database
public List<UserEntry> getAllUser(){
List<UserEntry> users = new ArrayList<UserEntry>();
String query = "SELECT * FROM LOGIN";
Cursor cursor = db.rawQuery(query, null);
//If there's at least one entry
if(cursor.moveToFirst()){
do{
UserEntry user = new UserEntry();
user.setUserName(cursor.getString(cursor.getColumnIndex("USERNAME")));
user.setPassword(cursor.getString(cursor.getColumnIndex("PASSWORD")));
//Add to list
users.add(user);
}while(cursor.moveToNext());
cursor.close();
}
return users;
}
//Returns all projects from the user
public List<ProjectEntry> getProjectsFromUser(String userName){
List<ProjectEntry> projects = new ArrayList<ProjectEntry>();
String selectQuery = "SELECT * FROM " + TABLE_PROJECT + " pr," +
"LOGIN lg, " + TABLE_PROJECT_USER + " pu WHERE LOGIN.USERNAME = '"
+ userName + "' AND pr." + KEY_ID + " = pu." + KEY_PROJECT_ID +
" AND pu." + KEY_USER_ID + " = LOGIN.ID";
Cursor c = db.rawQuery(selectQuery, null);
if(c.moveToFirst()){
do{
ProjectEntry project = new ProjectEntry();
project.setId(c.getInt(c.getColumnIndex(KEY_ID)));
project.setName(c.getString(c.getColumnIndex(KEY_NAME)));
project.setUserId(c.getInt(c.getColumnIndex(KEY_USER_ID)));
project.setDeadline(c.getString(c.getColumnIndexOrThrow(KEY_DEADLINE)));
projects.add(project);
}while(c.moveToNext());
}
return projects;
}
//Create project
public long createProject(ProjectEntry project, UserEntry user){
ContentValues valuesProject = new ContentValues();
ContentValues valuesProjectUser = new ContentValues();
valuesProject.put(KEY_USER_ID, user.getId());
valuesProject.put(KEY_NAME, project.getName());
valuesProject.put(KEY_DEADLINE, project.getDeadline().toString());
long id = db.insert(TABLE_PROJECT, null, valuesProject);
valuesProjectUser.put(KEY_PROJECT_ID, id);
valuesProjectUser.put(KEY_USER_ID, user.getId());
//Return the projects id, so that it can be found
return id;
}
public long createProject(ProjectEntry project, long user){
ContentValues values = new ContentValues();
values.put(KEY_USER_ID, user);
values.put(KEY_NAME, project.getName());
values.put(KEY_DEADLINE, project.getDeadline().toString());
long id = db.insert(TABLE_PROJECT, null, values);
//Return the projects id, so that it can be found
return id;
}
public void updateEntry(String userName,String password)
{
// Define the updated row content.
ContentValues updatedValues = new ContentValues();
// Assign values for each row.
updatedValues.put("USERNAME", userName);
updatedValues.put("PASSWORD",password);
String where="USERNAME = ?";
db.update("LOGIN",updatedValues, where, new String[]{userName});
}
}
package com.example.tasksketchgui;
导入java.util.ArrayList;
导入java.util.List;
导入com.example.tasksketchgui.sqlite.model.ProjectEntry;
导入com.example.tasksketchgui.sqlite.model.UserEntry;
导入android.content.ContentValues;
导入android.content.Context;
导入android.database.Cursor;
导入android.database.SQLException;
导入android.database.sqlite.SQLiteDatabase;
公共类后勤数据库适配器
{
静态最终字符串数据库\u NAME=“login.db”;
静态最终int数据库_版本=1;
公共静态final int NAME_COLUMN=1;
//TODO:为表中的每列创建公共字段。
//所有表的列
静态最终字符串键_ID=“_ID”;
静态最终字符串键\u NAME=“NAME”;
静态最终字符串键\u DEADLINE=“DEADLINE”;
静态最终字符串KEY\u USER\u ID=“USER\u ID”;
静态最终字符串KEY\u PROJECT\u ID=“PROJECT\u ID”;
//用于登录的列名
静态最终字符串KEY\u USER\u PASSWORD=“PASSWORD”;
静态最终字符串KEY\u USER\u NAME=“USERNAME”;
//用户任务的列名
静态最终字符串KEY\u TASK\u ID=“TASK\u ID”;
//表名
静态最终字符串表\u PROJECT=“projects”;
静态最终字符串表\u TASK=“tasks”;
静态最终字符串表\u TASK\u USER=“TASK\u USER”;
静态最终字符串表\u PROJECT\u USER=“PROJECT\u USER”;
//为项目创建表
静态最终字符串CREATE_TABLE_PROJECT=“CREATE TABLE IF NOT EXISTS”+TABLE_PROJECT+”(“
+KEY_ID+“整数主键自动递增,”+KEY_NAME+“文本,”
+KEY_DEADLINE+“TEXT”+“KEY_USER_ID+“INTEGER”+”;“;
//为任务创建表
静态最终字符串CREATE_TABLE_TASK=“CREATE TABLE IF NOT EXISTS”+TABLE_TASK+”(“
+KEY_ID+“整数主键自动递增,”+KEY_NAME+“文本,”
+KEY_项目_ID+“整数”+“KEY_截止日期”+“日期时间”+”;“;
//为taskUsers创建表
静态最终字符串CREATE_TABLE_TASK_USER=“CREATE TABLE IF NOT EXISTS”+TABLE_TASK_USER+”(“
+KEY_ID+“整数主键自动递增,”+KEY_任务\u ID+
“整数,”+键\用户\ ID+“整数”+”;
//为projectUsers创建表
静态最终字符串CREATE_TABLE_PROJECT_USER=“CREATE TABLE IF NOT EXISTS”+TABLE_PROJECT_USER+”(“
+KEY\u ID+“整数主键自动递增,”+KEY\u项目ID+“整数,”
+密钥用户ID+“整数”+”;“;
//SQL语句创建新数据库。
静态最终字符串数据库\u CREATE=“如果不存在创建表”+“登录”+
(“+”ID“+”整数主键自动递增“+”用户名文本、密码文本)
+创建表格项目+“;”+创建表格任务+“;”+创建表格任务用户
+“;”+创建表格项目用户+“;”;
//变量来保存数据库实例
公共数据库数据库;
//使用数据库的应用程序的上下文。
私人最终语境;
//数据库打开/升级帮助程序
私有数据库助手dbHelper;
公共登录数据库适配器(上下文_上下文)
{
上下文=_上下文;
dbHelper=newdatabasehelper(上下文、数据库名称、null、数据库版本);
}
public LoginDataBaseAdapter open()引发SQLException
{
db=dbHelper.getWritableDatabase();
归还这个;
}
公众假期结束()
{
db.close();
}
公共SQLiteDatabase getDatabaseInstance()
{
返回分贝;
}
公共void insertEntry(UserEntry用户)
{
ContentValues newValues=新ContentValues();
//为每行指定值。
newValues.put(“USERNAME”,user.getUserName());
newValues.put(“PASSWORD”,user.getPassword());
db.insert(“登录”,null,newValues);
///Toast.makeText(上下文,“提醒已成功保存”,Toast.LENGTH_LONG.show();
}
public void insertEntry(字符串用户名、字符串密码)
{
ContentValues newValues=新ContentValues();
//为每行指定值。
newValues.put(“用户名”,用户名);
newValues.put(“密码”,PASSWORD);
db.insert(“登录”,null,newValues);
///Toast.makeText(上下文,“提醒已成功保存”,Toast.LENGTH_LONG.show();
}
public int deleteUser(字符串用户名)
{
//String id=String.valueOf(id);
字符串,其中=“USERNAME=?”;
int numberofentriesdelected=db.delete(“LOGIN”,其中,新字符串[]{UserName});
//Toast.makeText(上下文,“成功删除条目的数量:”+numberofentriesdelected,Toast.LENGTH_LONG).show();
已删除的返回编号;
}
公共字符串getSinlgeUserPassword(字符串用户名)
{
Cursor Cursor=db.query(“LOGIN”,null,“USERNAME=?”,新字符串[]{USERNAME},null,null,null);
如果(cursor.getCount()您一次添加了所有表吗?
如果尚未删除并重新安装应用程序,则不会再次调用SQLiteOpenHelper的onCreate。您使用的是登录lg和usi
loginDataBaseAdapter=new LoginDataBaseAdapter(this);
loginDataBaseAdapter=loginDataBaseAdapter.open();
//Fill list of projects
List<ProjectEntry> projects = new ArrayList<ProjectEntry>();
projects = loginDataBaseAdapter.getProjectsFromUser("pontan");
SELECT * FROM projects pr,LOGIN lg, project_user pu WHERE LOGIN.USERNAME = 'pontan' AND pr._id = pu.project_id AND pu.user_id = LOGIN.ID
SELECT * FROM projects pr,LOGIN lg, project_user pu WHERE lg.USERNAME = 'pontan' AND pr._id = pu.project_id AND pu.user_id = lg.ID
String selectQuery = "SELECT * FROM " + TABLE_PROJECT + " pr," +
"LOGIN lg, " + TABLE_PROJECT_USER + " pu WHERE lg.USERNAME = '"
+ userName + "' AND pr." + KEY_ID + " = pu." + KEY_PROJECT_ID +
" AND pu." + KEY_USER_ID + " = lg.ID";