Java Android中的SQLite问题;没有这样的表格”;错误

Java Android中的SQLite问题;没有这样的表格”;错误,java,android,sql,sqlite,Java,Android,Sql,Sqlite,我在stack overflow中搜索过类似的问题,但在我的问题上,它们似乎都不适用或有效。我有一个创建SQLite数据库的应用程序,当涉及到表“LOGIN”时,它是完全可用的,但其他一切都会使应用程序崩溃。我的数据库由用户以及用户可以创建的项目和任务组成,因此,当我尝试列出特定用户完成的每个项目时,我会得到一个“没有这样的表”错误,即使该表绝对存在并且可以使用登录。我起初以为缓存中还有一个旧数据库,但我尝试过两次在出厂时重置设备,这会清除整个数据库,但错误仍然存在。怎么了 数据库帮助程序: p

我在stack overflow中搜索过类似的问题,但在我的问题上,它们似乎都不适用或有效。我有一个创建SQLite数据库的应用程序,当涉及到表“LOGIN”时,它是完全可用的,但其他一切都会使应用程序崩溃。我的数据库由用户以及用户可以创建的项目和任务组成,因此,当我尝试列出特定用户完成的每个项目时,我会得到一个“没有这样的表”错误,即使该表绝对存在并且可以使用登录。我起初以为缓存中还有一个旧数据库,但我尝试过两次在出厂时重置设备,这会清除整个数据库,但错误仍然存在。怎么了

数据库帮助程序:

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";