简体   繁体   English

正在进行事务时,无法启用或禁用SQLite外键约束

[英]SQLite Foreign Key Constraints cannot be enabled or disabled while there are transactions in progress

I want to have a Sqlite database that somewhat resembles my MySql database I use to store information. 我想拥有一个类似于我用于存储信息的MySql数据库的Sqlite数据库。 In Sqlite foreign keys are disabled by default. 在Sqlite中,默认情况下禁用外键。

When I try to use the "setForeignKeyConstraintsEnabled()" command I get the following error. 当我尝试使用“ setForeignKeyConstraintsEnabled()”命令时,出现以下错误。

java.lang.IllegalStateException: Foreign Key Constraints cannot be enabled or disabled while there are transactions in progress. java.lang.IllegalStateException:正在进行事务时,无法启用或禁用外键约束。 Finish all transactions and release all active database connections first. 完成所有事务并首先释放所有活动的数据库连接。

How do I fix this? 我该如何解决?

RegisterActivity RegisterActivity

    package e.adin_pc.spark;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.util.HashMap;
import java.util.Map;





public class Register extends AppCompatActivity {

    EditText Username,Password,Email,Birthday;
    Button Register;
    String insertURL = "http://10.0.2.2/skripte/insert_user.php";
    RequestQueue requestQueue;
    private DatabaseHandler db;
    private static final String TAG = "RegisterActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        Username=findViewById(R.id.UserNameReg_EditText);
        Password=findViewById(R.id.PasswordReg_EditText);
        Email=findViewById(R.id.EmailReg_EditText);
        Birthday=findViewById(R.id.BirthdayReg_EditText);
        Register=findViewById(R.id.register_Button);

        db=new DatabaseHandler(this);

         requestQueue = Volley.newRequestQueue(getApplicationContext());


        Register.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                StringRequest stringRequest = new StringRequest(Request.Method.POST,

                        insertURL, new Response.Listener<String>() {

                    @Override

                    public void onResponse(String response) {
                        Toast.makeText(Register.this,response,Toast.LENGTH_LONG).show();

                        //Make object
                        Users user=new Users();
                        user.setId(Integer.parseInt(
                        user.setUserName(Username.toString());
                        user.setPassword(Password.toString());
                        user.setEmail(Email.toString());
                        user.setBirthday(Birthday.toString());
                        user.setIs_Admin(false);


                        //INSERT IS CALLED HERE 
                        boolean insert = db.InsertUser(user);

                        Log.i(TAG,"Uspjelo je valjda ",null);

                    }

                }, new Response.ErrorListener() {

                    @Override

                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(Register.this,error.toString(),Toast.LENGTH_LONG).show();




                    }

                }) {

                    @Override

                    protected Map<String, String> getParams() throws AuthFailureError {

                        Map<String, String> parameters = new HashMap<String, String>();

                        parameters.put("USERNAME", Username.getText().toString());

                        parameters.put("PASSWORD", Password.getText().toString());

                        parameters.put("EMAIL", Email.getText().toString());

                        parameters.put("BIRTHDAY", Birthday.getText().toString());



                        return parameters;

                    }

                };



                requestQueue.add(stringRequest);

            }

        });
    }
}

DB Handler code 数据库处理程序代码

package e.adin_pc.spark;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Adin-PC on 3/30/2018.
 */

public class DatabaseHandler extends SQLiteOpenHelper {



    private static final String DATABASE_NAME = "Spark.db";
    private static final int VERSION = 1;

    //Tabela1
    private static final String table1_name="Users";
    private static final String Users_id = "Users_id";
    private static final String user_name = "user_name";
    private static final String password = "password";
    private static final String email = "email";
    private static final String birthday = "birthday";
    private static final String is_admin = "is_admin";
    //Table 2
    private static final String table2_name="Flights";
    private static final String Flights_id = "Flights_id";
    private static final String start_destination = "start_destination";
    private static final String end_destination = "end_destination";
    private static final String flight_start_time = "flight_start_time";
    private static final String Flight_end_time = "Flight_end_time";
    private static final String Price = "Price";
    //Table 3
    private static final String table3_name="User_flights";
    private static final String User_flights_id = "User_flights_id";
    private static final String User_fk = "User_fk";
    private static final String Flight_fk = "Flight_fk";


    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
         String Tb1Sql="CREATE TABLE "+table1_name+" ("+
                Users_id+" integer primary key , "+
                user_name+" text not null,"+
                password+" text not null,"+
                email+" text not null,"+
                birthday+" text not null,"+
                is_admin+" text not null"+" )";

        String Tb2Sql="CREATE TABLE "+table2_name+" ("+
                Flights_id+" integer primary key , "+
                start_destination+" text not null,"+
                end_destination+" text not null,"+
                flight_start_time+" text not null,"+
                Flight_end_time+" text not null,"+
                Price+" text not null"+" )";

        String Tb3Sql="CREATE TABLE "+table3_name+" ("+
                User_flights_id+" integer primary key , "+
                User_fk+" integer not null, "+
                "FOREIGN KEY ("+User_fk+") REFERENCES "+table1_name+"("+Users_id+"), "+
                Flight_fk+" integer not null, "+
                "FOREIGN KEY ("+Flight_fk+") REFERENCES "+table2_name+"("+Flights_id+")"+
                " )";

        db.setForeignKeyConstraintsEnabled(true); //ERROR IS HERE 
        //db.execSQL("PRAGMA foreign_keys=ON");  //THIS ALSO DOESNT WORK
        db.execSQL(Tb1Sql);
        db.execSQL(Tb2Sql);
        db.execSQL(Tb3Sql);



    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + table3_name);
        db.execSQL("DROP TABLE IF EXISTS " + table1_name);
        db.execSQL("DROP TABLE IF EXISTS " + table2_name);
        onCreate(db);
    }

//*---------------------------USER COMMANDS-------------------------------------------------------
 public boolean InsertUser(Users New_User){
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put(Users_id,New_User.getId());
        values.put(user_name,New_User.getUserName());
        values.put(password,New_User.getPassword());
        values.put(email,New_User.getEmail());
        values.put(birthday,New_User.getBirthday());
        values.put(is_admin,New_User.getIs_Admin());

        long result=db.insert(table1_name,null,values);
        db.close();

        if (result == -1) {
            return false;
        } else {
            return true;
        }
    }

public Users GetUser(String UserName, String Password){

     SQLiteDatabase db=this.getReadableDatabase();

     String Query="SELECT * FROM "+ table1_name+" WHERE "+user_name+" = "+UserName+" AND "+
             password+" = "+Password;



    Cursor c = db.rawQuery(Query, null);

    if (c != null)
        c.moveToFirst();

    Users user= new Users();
    user.setId(c.getInt(c.getColumnIndex(Users_id)));
    user.setUserName(c.getString(c.getColumnIndex(user_name)));
    user.setPassword(c.getString(c.getColumnIndex(password)));
    user.setEmail(c.getString(c.getColumnIndex(email)));
    user.setBirthday(c.getString(c.getColumnIndex(birthday)));

   String IsAdmin=c.getString(c.getColumnIndex(is_admin));
   String validation;
   if (IsAdmin=="true")
       user.setIs_Admin(true);
   else
       user.setIs_Admin(false);
    db.close();

   return user;




}










//*---------------------------FLIGTS COMMANDS-------------------------------------------------------

    public boolean InsertFlights(Flights New_flight){
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put(start_destination,New_flight.getStart_destination());
        values.put(end_destination,New_flight.getEnd_destination());
        values.put(flight_start_time,New_flight.getFlight_start_time());
        values.put(Flight_end_time,New_flight.getFlight_end_time());
        values.put(Price,New_flight.getPrice());

        long result=db.insert(table2_name,null,values);
        db.close();

        if (result == -1) {
            return false;
        } else {
            return true;
        }
    }

    /*
 * getting all flights under single user
 * */
    public List<Flights> getAllUSersFlights(long user_id) {
        List<Flights> flights = new ArrayList<Flights>();

        String selectQuery = "SELECT  * FROM " + table2_name +" INNER JOIN "+ table3_name+" ON "
                + table2_name+"."+Flights_id+" = "+table3_name+"."+Flight_fk+" WHERE "+table3_name+"."+User_fk+"="+user_id;



        SQLiteDatabase db = this.getReadableDatabase();
        Cursor c = db.rawQuery(selectQuery, null);

        // looping through all rows and adding to list
        if (c.moveToFirst()) {
            do {
                Flights td = new Flights();
                td.setId(c.getInt((c.getColumnIndex(Flights_id))));
                td.setStart_destination(c.getString(c.getColumnIndex(start_destination)));
                td.setEnd_destination(c.getString(c.getColumnIndex(end_destination)));
                td.setFlight_start_time(c.getString(c.getColumnIndex(flight_start_time)));
                td.setFlight_end_time(c.getString(c.getColumnIndex(Flight_end_time)));
                td.setPrice(c.getFloat(c.getColumnIndex(Price)));



                flights.add(td);
            } while (c.moveToNext());
        }
        db.close();

        return flights;
    }



    //*---------------------------USerFlights COMMANDS-------------------------------------------------------


    public boolean InsertUSerFlights(long user_id,long flight_id ){
        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put(User_fk, user_id);
        values.put(Flight_fk, flight_id);


        long result=db.insert(table3_name,null,values);

        if (result == -1) {
            return false;
        } else {
            return true;
        }
    }





}

Use the onConfigure() callback for calling setForeignKeyConstraintsEnabled() . 使用onConfigure()回调调用setForeignKeyConstraintsEnabled()

onCreate() runs is executed in a transaction. onCreate()运行在事务中执行。 It is also run only once and not for any later invocation of your app, so it's unsuitable for setting foreign keys pragma. 它也只运行一次,以后不再调用您的应用程序,因此不适合设置外键编译指示。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM