la pregunta lo dice he estado indagando bastante y todos los ejemplos códigos y demas encontrado no funcionan,cabe recalcar que no soy nuevo en esto xD pero es muy raro intente con varios ejemplos como:
http://sushanta1991.blogspot.com.co/2015/02/how-to-write-data-to-csv-file-in-unity.htmlo la primera respuesta de esta
http://answers.unity3d.com/questions/275960/newbie-simple-script-to-check-excel-file-to-dispal.htmly no edita el csv no se que hacer alguien ha hecho algo similar, algun tutorial o algo ?
logre hacerlo pero no guarda el archivo en android :s alguna idea? le quite el aplication.datapath ya que no quiero que me lo guarde en esa carpeta pero igual no lo guarda en ningún sitio (utilice el buscador)
podrias usar Application.persistentDataPathque no te lo guarda en la carpeta del juego por ejemplo en windows lo guarda en C:\Users\user\AppData\LocalLow\nombredelacompañia
buena idea pero necesito que no quede en una ruta profunda ni nada de eso, es decir que quede en una carpeta en el root del dispositivo tipo /csv o algo asi pero no funciona :s y pues ahi estoy mirando como hago
[quote author=KsCorrales" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35605" data-ipsquote-contentcommentid="129373">buena idea pero necesito que no quede en una ruta profunda ni nada de eso, es decir que quede en una carpeta en el root del dispositivo tipo /csv o algo asi pero no funciona :s y pues ahi estoy mirando como hago [/quote]encontre esto por ahi
Título: unity3d escribir o editar un CSV
Publicado por: KsCorrales en Abril 09, 2016, 06:59:09 PM
nada ni con persistent ni con datapath segun lei era de permisos la idea es guardar en el dispositivo interno como es posible que no funcione es que no entiendo :v
debuguee el aplication.datapath y el no añade el slash entonces
return Application.dataPath + "/Saved_data.csv";
tambien
return Application.dataPath + "/" + "Saved_data.csv";
y tambien
return Application.dataPath + "Saved_data.csv";
lo mismo con persistent data pero nada no se que hacer >:c
[quote author=KsCorrales" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35605" data-ipsquote-contentcommentid="129375">
yo tambien supuse que el primero, ya que debuguee el datapath pero cuando compilo y ejecuto en la tablet el archivo no lo crea :c y en el editor si lo crea y lo edita no se
nada no se que hacer, ni con esta solucion que dan ahí
http://answers.unity3d.com/questions/854658/android-persistent-data-loading-fails.html
A ver. Yo tengo una bbdd en StreamingAssets que copio al Persistent siempre al inicio de la app, que es para Android. A mí me funciona perfectamente.Yo hago esto:string filepath = string.Format("{0}/{1}", Application.persistentDataPath, DBName);
Db...
File.WriteAllBytes(filepath, loadDb.bytes);Y como permisos de app, Write Access = Internal Only.
a ver lo que yo necesito es guardar un simple csv apartir de un formulario, y ya, no necesito una base de datos no es posible guardarlo internamente?, osea el ya esta guardandolo y sobreescribiendolo, en el editor funciona muy bien pero en adroid he probado de 10mil maneras y nada, segun lei por seguridad o algo asi no se permite crear archivos que no sean fotos en el almacenamiento interno. no se si sea mentira :s
Que no digo que pongas una bbdd. Es el ejemplo. Lee hombre. No creo que una bbdd sean fotos, vamos. Es un archivo.Pero en fin, cada uno a lo suyo.
@iRobb lo que pasa es que yo no he tocado mucho eso ni c# mmmmm mira es que segun creo como lo tengo deberia funcionar,
StringBuilder sb = new StringBuilder();
for (int index = 0; index < length; index++)
sb.AppendLine(string.Join(delimiter, output[index]));
string filePath = getPath();
StreamWriter outStream = System.IO.File.AppendText(filePath);
outStream.WriteLine(sb);
outStream.Close();
Debug.Log ("saved");
bueno mirare esa manera de hacerla tuya para ver si lo logro hacer, muchas gracias :3
Te doy más detalles, ya que depende de donde de guardes los archivos. Me explico:Si lo guardas en persistentDataPath, con los permisos de internalOnly son suficientes, peeeerooo si creas subcarpetas dentro de persistentDataPath y guardas dentro, entonces necesitarás ExternalSD como permisos.Donde tienes en tu código el directorio donde guardas? ese getPath() que tiene?
private string getPath(){
#if UNITY_EDITOR
return Application.dataPath +"/CSV/"+"Saved_data.csv";
#elif UNITY_ANDROID
return Application.persistentDataPath + "/"+ "Saved_data.csv";
#elif UNITY_IPHONE
return Application.persistentDataPath + "/"+"Saved_data.csv";
#else
return "/"+"Saved_data.csv";
#endif
Debug.Log ("get path leido");
}mmmm probe de nuevo con un codigo de prueba con hello world y nada :s en el buscador de la tablet no lo guarda empiezo a pensar que tiene que ver con permisos o algo asi, porque supuestamente a todo el mundo le funciona menos a mi ¬_¬ o no se si sea el csv, aunque un csv es como texto plano pero no se
Vamos a ir por pasos. Ese csv, de donde viene? Es decir, en el código del StringBuilder, ya lo das por creado sino entiendo mal. Pero donde se crea? O de donde viene?
mmmmm baia osea en el editor, el crea el archivo, en android debe existir el archivo?, no sabia que debía ser así, o si lo debe crear?
este es el codigo de ejemplo entero:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System;
using UnityEngine.UI;
public class crearinscripcion : MonoBehaviour {
public Dropdown dia;
public Dropdown mes;
public Text ano;
public Text nombre;
public Dropdown genero;
public Text edad;
public Text email;
public Toggle recordatorio;
public Toggle promociones;
public byte[] saveData;
private List<string[]> rowData = new List<string[]>();
// Use this for initialization
void Start () {
}
void Update(){
Debug.Log (Application.persistentDataPath);
Debug.Log("valor dia: " + dia.value);
Debug.Log("valor mes: " + mes.value);
Debug.Log("valor año: " + ano.text);
Debug.Log("valor nombre: " + nombre.text);
Debug.Log("valor genero: " + genero.value);
Debug.Log("valor edad: " + edad.text);
Debug.Log("valor email: " + email.text);
if (recordatorio.isOn) {
Debug.Log ("valor recordatorio: es activo");
} else {
Debug.Log ("valor recordatorio: es inactivo");
}
if (promociones.isOn) {
Debug.Log ("valor promociones: es activo");
}else {
Debug.Log ("valor promociones: es inactivo");
}
}
public void Save(){
// Creating First row of titles manually..
string[] rowDataTemp = new string[9];
rowDataTemp[0] = "dia";
rowDataTemp[1] = "mes";
rowDataTemp[2] = "ano";
rowDataTemp[3] = "nombre";
rowDataTemp[4] = "genero";
rowDataTemp[5] = "edad";
rowDataTemp[6] = "email";
rowDataTemp[7] = "recordatorio";
rowDataTemp[8] = "promociones";
rowData.Add(rowDataTemp);
// You can add up the values in as many cells as you want.
rowDataTemp = new string[9];
rowDataTemp[0] = dia.value.ToString();
rowDataTemp[1] = mes.value.ToString();
rowDataTemp[2] = ano.text;
rowDataTemp[3] = nombre.text;
rowDataTemp[4] = genero.value.ToString();
rowDataTemp[5] = edad.text;
rowDataTemp[6] = email.text;
if (recordatorio.isOn) {
rowDataTemp[7] = "acepto";
} else {
rowDataTemp[7] = "no acepto";
}
if (promociones.isOn) {
rowDataTemp[8] = "acepto";
}else {
rowDataTemp[8] = "no acepto";
}
rowData.Add(rowDataTemp);
string[][] output = new string[rowData.Count][];
for(int i = 0; i < output.Length; i++){
output = rowData;
}
int length = output.GetLength(0);
string delimiter = ";";
StringBuilder sb = new StringBuilder();
for (int index = 0; index < length; index++)
sb.AppendLine(string.Join(delimiter, output[index]));
string filePath = getPath();
StreamWriter outStream = System.IO.File.AppendText(filePath);
outStream.WriteLine(sb);
outStream.Close();
Debug.Log ("saved");
}
// Following method is used to retrive the relative path as device platform
private string getPath(){
#if UNITY_EDITOR
return Application.dataPath +"/CSV/"+"Saved_data.csv";
#elif UNITY_ANDROID
return Application.persistentDataPath + "/"+ "Saved_data.csv";
#elif UNITY_IPHONE
return Application.persistentDataPath + "/"+"Saved_data.csv";
#else
return "/"+"Saved_data.csv";
#endif
Debug.Log ("get path leido");
}
}
Sin ver el código por lo que dices. Ya veo el error de concepto.Coloca el archivo en StreamingAssets, peeeeeroooo tienes que copiarlo tú a PersistentDataPath a menos que estés en el Editor. Ahora bien, que pasa aquí. Qué cada persistent es diferente por plataforma. En tu caso, si tienes que copiar de Streaming a Persistent en Android, no sé si sabes que en Android el apk se trata como el paquete jar, por tanto el StreamingAssets en android es:pathSource = "jar:file://" + Application.dataPath + "!/assets/" + fileName;pero esto realmente se debe tratar como si fuera un archivo externo de tipo WWW. Por tanto, para recuperar el archivo y copiarlo, debes hacer: WWW www = new WWW(pathSource);el proceso típico de recuperación por WWW con un while is done, bla bla y finalmente lo guardas así: File.WriteAllBytes(pathTarget, www.bytes);Donde pathTarget es el persistentDataPath.
wow muchas gracias por el apoyo, a ver según entiendo hay que al iniciar la app, coger y copiar de streaming assets al persistent data,
#if UNITY_ANDROID
pathSource = "jar:file//" + Application.dataPath + "!/assets/" + "Saved_data.csv";
WWW www = new WWW(pathSource);
while(!www.isDone){
Debug.Log("Downloading... "+ www.progress);
}
Debug.Log("Download: " + www.progress);
pathTarget = Application.persistentDataPath + "/"+ "Saved_data.csv";
File.WriteAllBytes(pathTarget, www.bytes);
#endif
hace rato no tocaba unity3d, ya que yo soy mas de backend :3 jajajajaja pero cuando yo le doy al writeAllByts ese pathTarget ese solo la ruta o con el nombre incluido? xD es que aun no me funciona, otra cosa esto lo puse en la función start, ahí debería estar no?, una vez ya esta hecho esto, con el boton procedo a realizar lo mio es decir en mi función save(). o no si se use mal la clase WWW. ya que nunca la había usado ajjaja me toco investigar :v
Vaya. Pensaba que sabías como iba la www. Ponla en una coroutine (si?) y el while con un yield. Comprueba si hay error del www que eso no tiene nada que ver con Unity, sino con el código.
[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35605" data-ipsquote-contentcommentid="129521">Vaya. Pensaba que sabías como iba la www. Ponla en una coroutine (si?) y el while con un yield. Comprueba si hay error del www que eso no tiene nada que ver con Unity, sino con el código.[/quote]No estoy muy familiarizado a hacer este tipo de cosas en unity, lo siento :v estuve indagando un poco sobre el www y pues la mayoria no usan una corrutina, vi que alguien hacia algo similar a lo que comentaste arriba en un comentario con uan base de datoseste es el enlace:
http://answers.unity3d.com/questions/126578/how-do-i-get-into-my-streamingassets-folder-from-t.htmly aqui la corrutina, pero igual no funciona :v me ayudas? XD o tienes algun sitio donde explique esto, en la doc no dice nada.
IEnumerator DataSaved()
{
pathSource = "jar:file//" + Application.dataPath + "!/assets/" + "Saved_data.csv";
WWW www = new WWW(pathSource);
while(!www.isDone){
yield return www;
}
pathTarget = Application.persistentDataPath + "/"+ "Saved_data.csv";
File.WriteAllBytes(pathTarget, www.bytes);
}
Así a bote pronto parece que está bien. Qué error te da?Te escribe el archivo con 0 bytes o no te escribe nada de nada?Recuerdas lo de los permisos? Si escribes en el persistent, ponle Internal Only en el Write Access de los player settings.
[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35605" data-ipsquote-contentcommentid="129856 date=1461012963]Así a bote pronto parece que está bien. Qué error te da?Te escribe el archivo con 0 bytes o no te escribe nada de nada?Recuerdas lo de los permisos? Si escribes en el persistent, ponle Internal Only en el Write Access de los player settings.[/quote]mmmm asi no pasa nada, como puedo debuguearlo en android directamente, el remote no sirve para nada, y pues principalmente, la carpeta con el bundle identifier no la crea, entonces no se que hacer, uso el buscador de la tablet y tampoco
Espera, dame un minuto.
es que es muy raro porque instalo la app, pero en android -> data no se crea la carpeta de la app com.nombre.producto, pues ahí irían los nombres de mi app eso esta hecho bien, y esta en internal, mmm intente exportarlo como proyecto android y abrir en eclipse, y después debuguear directamente, pero me saltaron muchas alertas y desiste por eso, le arregle un par y salían mas :v jajajajaja entonces ni idea. con un debug directo en android creo que ya me podría defender jajajajjaja tu como debugueas?
Subiendo...
TestAndroidAccess.rarEs que no siempre vas a poder ver la estructura de dirs en Android por seguridad.Tienes que abstraerlo. Este proyectito te copia el fichero csv, y comprueba que existe. El text te devolverá true/false si lo ha encontrado o no.Recuerda que, en el while del www, habría que añadir un timeout por precaución.
Lo he probado y me devuelve true.
aaaaaa el debug lo haces a mano jajajaj ok yo me referia a un debug debug jajajajjaja voy a probrar y te aviso, muchas gracias enserio
mmmmm baia empiezo a creer que es la tablet, me aparece todo bien, como si hubiera salido todo perfecto, pero no esta el archivo ni siquiera hay carpeta con el nombre del bundle identifier que supuestamente el archivo debe ir ahí no? pues tengo entendido eso, voy a mirar bien en las opciones de la tablet, y a probar en otros dispositivos.
No creas, yo tampoco veo este proyecto en este caso. Los otros sí, aunque son mucho más grandes.Prueba de abrir desde código el archivo csv y toquetearlo y ver si te guarda datos.
[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35605" data-ipsquote-contentcommentid="129863 date=1461016822]No creas, yo tampoco veo este proyecto en este caso. Los otros sí, aunque son mucho más grandes.Prueba de abrir desde código el archivo csv y toquetearlo y ver si te guarda datos.[/quote]mmmmmm acabo de hacerlo y nada, creí que iba a servir cuando abrí el archivo a código y me salieron números raros y pues lo abrí en excel y me decía que el archivo estaba dañado, ok entonces lo que hice fue llenar 3 celdas y guardar como csv, después de esto lo mire desde el código y quedaba bien separado por comas, pero aun así en el dispositivo no lo guarda :s no aparece ni con el buscador de android ni metiéndome a los archivos desde windows jajajajjajaja :S debe ser la tablet si o si creo
Es una samsung galaxy tab E
Bueno es que el csv que te puse me lo inventé. No tenia nada o basura. Pero no te preocupes, de verdad no es de tu tablet. Si no lo tienes "rooted" pasa.
jajajajajjajajaajajaj hubieras empezado por ahi :S jajajaj entonces no hay manera de crear el archivo sin root ? ,
yo estaba probando con
http://docs.unity3d.com/ScriptReference/Application-streamingAssetsPath.html (http://docs.unity3d.com/ScriptReference/Application-streamingAssetsPath.html)
por si acaso, pero da el mismo resultado, done pero no lo crea
Pero puedes acceder a él, cierto? O sea lo puedes abrir. Si no el código lo he hecho mal.El tema es que no lo puedes ver directamente en el dispositivo.
Pero desde Unity sí, cierto?
[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35605" data-ipsquote-contentcommentid="129867 date=1461019774]Pero puedes acceder a él, cierto? O sea lo puedes abrir. Si no el código lo he hecho mal.El tema es que no lo puedes ver directamente en el dispositivo.[/quote]mmmmmm si osea de acceder si accede porque pues segun lo que habia hecho mas e lejemplo que me pasaste si accede, el problema es que la idea era sobreescribir y sobreescribir para tener unos datos en ese csv
despues de eso poder sacar ese csv del dispositivo como un archivo comun.
A ver, es cierto. Yo estoy en un proyecto y los veo perfectamente. Por qué este no? Déjame mirar diferencias.
Ya lo he visto!
1. Tenemos un error en el while!!!!!
while (!www.isDone) {
yield return null;
}
2. Crea el proyecto con Write Access External SD. Luego se puedo revertir a internal en la versión de producción, pero eso hace que cree las estructuras y sean visibles en ese dispositivo.
mmmm entonces tiene que devolver null si no ha terminado, bueno ya lo corrijo pero la segunda parte no la entendi, osea creo un proyecto con la opcion de escritura externa, y luego como la revierto?
Fijate si creando un TXT dentro de la carpeta Resources te da los permisos luego en la instalación de Android.
[quote author=KsCorrales" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35605" data-ipsquote-contentcommentid="129881 date=1461070028]mmmm entonces tiene que devolver null si no ha terminado, bueno ya lo corrijo pero la segunda parte no la entendi, osea creo un proyecto con la opcion de escritura externa, y luego como la revierto?[/quote]El mismo proyecto. Pon como external, compila y ejecuta en el dispositivo entonces te creará las estructuras visibles.Luego, si quieres, lo puedes revertir a internal otra vez o no.