做了个安卓的APP,想增加一个数据的导入导出功能,在真机上测试显示成功了,但是没有数据的输出。想请教一下。
好几个模型都试过了,都没有用。
在电脑上和gitHUB上都构建成功了。但是。这个功能始终没有好。
做了个安卓的APP,想增加一个数据的导入导出功能,在真机上测试显示成功了,但是没有数据的输出。想请教一下。
好几个模型都试过了,都没有用。
在电脑上和gitHUB上都构建成功了。但是。这个功能始终没有好。
好问题,但是我没听懂。 数据读写,那就是权限问题
就是手机上显示导出成功。但是没有东西。
对,可以先检查一下
给我的感觉是你只看了交互是导出成功,但是发现没数据,然后你不看代码?
如果觉得哪里有问题 把代码贴出来呗
看看代码, try catch 。
总不能try 没有 log吧, 代码看看。
先认可佬的检查能力,代码没问题。
显示成功,我们先就成功导出为主。
那么就是存储在哪里的问题。找不到 == 被隐藏了
否则,把App权限开到最大
看了,但是没有所以然。
“没有日志的情况下看问题无异于”
晚上才能看电脑
导出到哪里了,内部存储? 是不是找错地方了
真机上测试成功了 但是没有数据 那不就是没成功吗? 你排除代码问题先
const FIXED_USER_ID = ‘default_user’;
5
6 +// 导入日期格式化函数
7 +import { format } from 'date-fns';
8 +
9 // 获取今日记录
10 export const getTodayRecords = async () => {
11 try {
...
24 id: record.id || generateId(),
25 user_id: FIXED_USER_ID,
26 };
27 -
27 +
28 const updatedRecords = [...allRecords, newRecord];
29 localStorage.setItem('work_records', JSON.stringify(updatedRecords));
30 return newRecord;
...
140 }
141 };
142
143 -// 导出数据为 JSON 格式
144 -export const exportToJSON = async () => {
145 - try {
146 - const allRecords = await getAllRecords();
147 - const exportData = {
148 - version: '1.0',
149 - exportDate: new Date().toISOString(),
150 - recordCount: allRecords.length,
151 - records: allRecords
152 - };
153 -
154 - const jsonString = JSON.stringify(exportData, null, 2);
155 - const fileName = `work_records_${format(new Date(), 'yyyy-MM-dd_HHmmss')}.json`;
156 -
157 - // 调试信息
158 - console.log('=== 导出 JSON 开始 ===');
159 - console.log('window.cordova:', window.cordova);
160 - console.log('window.cordova.file:', window.cordova?.file);
161 - console.log('记录数量:', allRecords.length);
162 -
163 - // 检查是否在 Cordova 环境中
164 - if (window.cordova && window.cordova.file) {
165 - console.log('使用 Cordova 文件系统');
166 - return await saveFileCordova(jsonString, fileName, 'application/json');
167 - } else {
168 - console.log('使用浏览器下载');
169 - // Web 浏览器环境
170 - const blob = new Blob([jsonString], { type: 'application/json' });
171 - const url = URL.createObjectURL(blob);
172 - const link = document.createElement('a');
173 - link.href = url;
174 - link.download = fileName;
175 - document.body.appendChild(link);
176 - link.click();
177 - document.body.removeChild(link);
178 - URL.revokeObjectURL(url);
179 - alert('文件已下载到浏览器默认下载目录');
180 - return true;
181 - }
182 - } catch (error) {
183 - console.error('导出JSON失败:', error);
184 - alert('导出失败: ' + error.message);
185 - throw error;
186 - }
187 -};
188 -
189 -// 导出数据为 CSV 格式
190 -export const exportToCSV = async () => {
191 - try {
192 - const allRecords = await getAllRecords();
193 -
194 - // CSV 表头
195 - const headers = ['日期', '工件名称', '数量', '单件工时(分钟)', '总工时(分钟)', '按小时计算'];
196 -
197 - // 构建 CSV 行
198 - const rows = [];
199 - allRecords.forEach(record => {
200 - record.items.forEach(item => {
201 - rows.push([
202 - record.date,
203 - item.name,
204 - item.quantity,
205 - item.timePerUnit,
206 - item.totalTime,
207 - item.isHourlyBased ? '是' : '否'
208 - ]);
209 - });
210 - });
211 -
212 - // 组合成 CSV 字符串(添加 BOM 以支持中文)
213 - const csvContent = '\ufeff' + [
214 - headers.join(','),
215 - ...rows.map(row => row.map(cell => `"${cell}"`).join(','))
216 - ].join('\n');
217 -
218 - const fileName = `work_records_${format(new Date(), 'yyyy-MM-dd_HHmmss')}.csv`;
219 -
220 - // 调试信息
221 - console.log('=== 导出 CSV 开始 ===');
222 - console.log('window.cordova:', window.cordova);
223 -
224 - // 检查是否在 Cordova 环境中
225 - if (window.cordova && window.cordova.file) {
226 - console.log('使用 Cordova 文件系统');
227 - return await saveFileCordova(csvContent, fileName, 'text/csv');
228 - } else {
229 - console.log('使用浏览器下载');
230 - // Web 浏览器环境
231 - const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
232 - const url = URL.createObjectURL(blob);
233 - const link = document.createElement('a');
234 - link.href = url;
235 - link.download = fileName;
236 - document.body.appendChild(link);
237 - link.click();
238 - document.body.removeChild(link);
239 - URL.revokeObjectURL(url);
240 - alert('文件已下载到浏览器默认下载目录');
241 - return true;
242 - }
243 - } catch (error) {
244 - console.error('导出CSV失败:', error);
245 - alert('导出失败: ' + error.message);
246 - throw error;
247 - }
248 -};
249 -
250 -// 导入数据
251 -export const importData = async (data, format) => {
252 - try {
253 - let records = [];
254 - if (format === 'json') {
255 - records = Array.isArray(data) ? data : data.records || [];
256 - } else if (format === 'csv') {
257 - // CSV格式暂不支持导入完整记录结构
258 - return false;
259 - }
260 -
261 - // 获取所有现有记录(包括所有user_id的记录)
262 - const allStoredRecords = JSON.parse(localStorage.getItem('work_records') || '[]');
263 - const existingIds = new Set(allStoredRecords.map(r => r.id));
264 -
265 - // 过滤掉已存在的记录,并确保所有记录都有正确的user_id
266 - const newRecords = records
267 - .filter(r => r && r.id && !existingIds.has(r.id))
268 - .map(r => ({
269 - ...r,
270 - user_id: FIXED_USER_ID
271 - }));
272 -
273 - if (newRecords.length > 0) {
274 - const updatedRecords = [...allStoredRecords, ...newRecords];
275 - localStorage.setItem('work_records', JSON.stringify(updatedRecords));
276 - return newRecords.length;
277 - }
278 - return 0;
279 - } catch (error) {
280 - console.error('导入数据失败:', error);
281 - throw error;
282 - }
283 -};
284 -
143 // 生成唯一ID
144 const generateId = () => {
145 return Date.now().toString(36) + Math.random().toString(36).substr(2);
146 };
147
148 -// Cordova 文件保存函数
149 -const saveFileCordova = (content, fileName, mimeType) => {
150 - return new Promise((resolve, reject) => {
151 - console.log('开始保存文件到 Cordova:', fileName);
152 -
153 - // 检查 Cordova 文件插件是否可用
154 - if (!window.cordova || !window.cordova.file) {
155 - reject(new Error('Cordova 文件插件不可用'));
156 - return;
157 - }
158 -
159 - // 使用 externalDataDirectory (应用专属目录,不需要权限)
160 - const dirPath = window.cordova.file.externalDataDirecto
用的react native吗