在不关闭光标的情况下打开许多文件,如果我关闭光标就会冻结

时间:2017-02-20 22:56:24

标签: android android-sqlite

我收到错误:

  

引起:应用程序打开了太多文件。最大可用   一个进程中的文件描述符默认为1024。

发生在我底部片段的第56行。我已经尝试library(tidyverse) set.seed(47) # make generated data reproducible dfA <- data.frame(`First Var Name` = rnorm(20, 3), `Second Var Name` = rnorm(20, 5), `Third Var Name` = rnorm(20, 4), `Fourth Var Name` = rnorm(20, 4)) dfB <- data.frame(Grouping = c("A", "B", "B", "A"), Varname = c("First Var Name", "Second Var Name", "Third Var Name", "Fourth Var Name")) # unless you tell it not to, `data.frame` will replace spaces with periods, so update Varname dfB <- dfB %>% mutate(Varname = make.names(Varname)) dfC <- dfA %>% gather() %>% left_join(dfB, by = c("key" = "Varname")) %>% nest(-Grouping) %>% mutate(pca = map(data, ~prcomp(unstack(.x, value ~ key))$x[, 1])) %>% unnest(pca) %>% unstack(pca ~ Grouping) dfC #> A B #> 1 -1.74340058 -0.80430828 #> 2 -0.90015763 0.55121748 #> 3 0.72162180 0.18540745 #> 4 0.68609468 -0.11332615 #> 5 -0.68003234 0.43964407 #> 6 1.39659346 0.37532545 #> 7 1.08617617 -1.44789829 #> 8 0.61576966 -1.01015131 #> 9 -1.09667280 -1.78978142 #> 10 1.14931837 -0.16714979 #> 11 1.02694416 -0.08245775 #> 12 0.03852488 -0.83134735 #> 13 0.05820030 -1.97289196 #> 14 2.35215929 1.62823022 #> 15 -0.38723810 2.24902954 #> 16 -1.65000542 -0.43809477 #> 17 0.19792790 0.47133845 #> 18 -0.89921705 0.85804619 #> 19 -0.88727866 1.01371806 #> 20 -1.08532810 0.88545017 在填充适配器后关闭数据库。关闭数据库后,我不确定为什么会这样做。如果我在使用它们后尝试关闭数据库和光标,则会出现错误,尝试重新打开已经关闭的对象。所以如果我不关闭它们就会很生气,因为它太多了,如果我关闭它们就会发疯并且不让我重新打开它们。

db.close();

我还尝试通过

关闭光标
public class BottomFragment extends Fragment {
    public Cursor mBottomCursor, mNewBottomCursor;
    EmployeeDBHandler dbHandler;
    private ListView mBottomListView;
    private SQLiteDatabase db;
    private String table = EmployeeDBHandler.TABLE_EMPLOYEE;
    int mStartingEmployeeID = myStartingNumber;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_bottom_list, container, false);
        dbHandler = EmployeeDBHandler.getInstance(getContext());
        db = dbHandler.getWritableDatabase();
        mBottomCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " +
                "Employee_number" + "!=" + mStartingEmployeeID + " AND " +
                "Manager_employee_number" + "=" + mStartingEmployeeID + " ORDER BY " +
                "Last_name" + " ASC", null);
        mBottomListView = (ListView) view.findViewById(android.R.id.list);
        BottomListCursorAdapter mBottomAdapter = new BottomListCursorAdapter(getContext(), mBottomCursor);
        mBottomListView.setAdapter(mBottomAdapter);
        return view;
    }

    public void refreshList(Cursor cursor) {
        cursor.moveToFirst();
        String mEmployeeNumber = cursor.getString(1);
        dbHandler = EmployeeDBHandler.getInstance(getContext());
        db = dbHandler.getWritableDatabase();
        mNewBottomCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " +
                "Employee_number" + "!=" + mStartingEmployeeID + " AND " +
                "Manager_employee_number" + "=" + mEmployeeNumber + " ORDER BY " +
                "Last_name" + " ASC", null);
        BottomListCursorAdapter bottomListCursorAdapter = new BottomListCursorAdapter(getActivity(), cursor);
        bottomListCursorAdapter.swapCursor(mNewBottomCursor);
        mBottomListView.setAdapter(bottomListCursorAdapter); //this is where Logcat says the error is occurring 
        db.close();
    }
}

我为refreshList方法执行此操作,应用程序在调用此方法时冻结。如果我删除它并执行显示的第一个refreshList方法,我会打开太多文件。

1 个答案:

答案 0 :(得分:0)

您应该在整个应用程序(Singleton)中创建一个SQLiteDatabase处理程序。你应该在onStop上关闭它。您正在关闭数据库,但是您可能忘记调用refreshList(只是猜测)