我收到错误:
引起:应用程序打开了太多文件。最大可用 一个进程中的文件描述符默认为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方法,我会打开太多文件。
答案 0 :(得分:0)
您应该在整个应用程序(Singleton)中创建一个SQLiteDatabase处理程序。你应该在onStop上关闭它。您正在关闭数据库,但是您可能忘记调用refreshList(只是猜测)