做了个应用,有点问题

做了个安卓的APP,想增加一个数据的导入导出功能,在真机上测试显示成功了,但是没有数据的输出。想请教一下。

好几个模型都试过了,都没有用。

在电脑上和gitHUB上都构建成功了。但是。这个功能始终没有好。

4 Likes

好问题,但是我没听懂。 数据读写,那就是权限问题

2 Likes

就是手机上显示导出成功。但是没有东西。

1 Like

对,可以先检查一下

2 Likes

给我的感觉是你只看了交互是导出成功,但是发现没数据,然后你不看代码?

1 Like

如果觉得哪里有问题 把代码贴出来呗

1 Like

看看代码, try catch 。

总不能try 没有 log吧, 代码看看。

先认可佬的检查能力,代码没问题。

显示成功,我们先就成功导出为主。

那么就是存储在哪里的问题。找不到 == 被隐藏了

否则,把App权限开到最大

1 Like

看了,但是没有所以然。

“没有日志的情况下看问题无异于”

1 Like

晚上才能看电脑

导出到哪里了,内部存储? 是不是找错地方了

真机上测试成功了 但是没有数据 那不就是没成功吗? 你排除代码问题先

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吗