黑马程序员心得(精选9篇)
篇1:黑马程序员心得
黑马程序员:动态数据写入pdf模板心得
前言
1.背景: 在项目中前段时间遇到一个问题,就是客户要求学生在线填写一些基础信息,保存到数据库的同时,给学生提供下载填写好的信息的pdf文件供下载,一开始我选择用Itext类去解析word文档模板,生成rtf文件,之后将学生填写的信息保存到数据时将数据同时写入到rtf模板中,在进行转为pdf,但是实现之后下载查看发现,中文不会乱码,纯数字也不会乱码,但是中文加数字,和特殊符号会出现名义上的乱码,(其实不是程序的乱码,只是写到word的rtf文件中的数据不会自动识别要用那些字体导致的),上网,翻墙,茶不思饭不想的去找解决办法,终于在我不懈的努力下还是没有解决,故放弃.注:程序员要有一个舍得的心,不能在一个方向上钻牛角尖,跳跳代码同我家,有舍必有得.2.正文: 好了,废话不大多说,上正确的代码和思路(其中有完成之前我所遇到的问题和踩的坑): 材料: itext的jar包包:官网:http://sourceforge.net/projects/itext/files/ Word文档模板-->转为pdf(不会的,网上有教程)Adobe Acrobat软件编辑pdf加载文本域填充数据用(网上有关于此软件的使用教程)
黑马程序员郑州中心 编著
Demo展示: public void test1_1(){
BaseFont bf;
Font font = null;
try {
bf
=
BaseFont.createFont(“STSong-Light”, “UniGB-UCS2-H”,BaseFont.NOT_EMBEDDED);//创建字体
font = new Font(bf,12);//使用字体
} catch(DocumentException | IOException e){
e.printStackTrace();
}
Document document = new Document();
try {
PdfWriter.getInstance(document,new FileOutputStream(“pdfFolder/2.pdf”));
document.open();
document.add(new Paragraph(“hello word 你好 世界”,font));//引用字体
document.close();
} catch(FileNotFoundException | DocumentException e)
黑马程序员郑州中心 编著
{
System.out.println(“file create exception”);
}
} 上处代码会产生一个pdf文件,如下:
以上掌握之后,只是塞个牙缝,总不能用代码去向pdf中花一些复杂的表格吧,要死人不说,还不能优化和变通,最主要的是不能控制样式.---编辑pdf模板文件:
网上截图(展示利用此软件进行编辑pdf的文本域):
黑马程序员郑州中心 编著
Word模板(部分截图):
黑马程序员郑州中心 编著
代码展示: public void fillTemplate(){//利用模板生成pdf //模板路径
String templatePath = “pdfFolder/template_demo.pdf”;//生成的新文件路径
String newPDFPath = “pdfFolder/newPdf.pdf”;PdfReader reader;FileOutputStream out;ByteArrayOutputStream bos;PdfStamper stamper;try {
out = new FileOutputStream(newPDFPath);//输出流 reader = new PdfReader(templatePath);//读取pdf模板 bos = new ByteArrayOutputStream();stamper = new PdfStamper(reader, bos);AcroFields form = stamper.getAcroFields();
String[] str = {“123456789”,“传智播客”,“男”,“1994-00-00”,“110”,“郑州市”};
int i = 0;
java.util.Iterator
String name = it.next().toString();
黑马程序员郑州中心 编著
System.out.println(name);form.setField(name, str[i++]);}
stamper.setFormFlattening(true);//如果为false那么生成的PDF文件还能编辑,一定要设为true stamper.close();
Document doc = new Document();PdfCopy copy = new PdfCopy(doc, out);doc.open();
PdfImportedPage importPage =copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);copy.addPage(importPage);doc.close();
} catch(IOException e){ System.out.println(1);
} catch(DocumentException e){ System.out.println(2);} }
3.成品代码:
上述代码只是一个小的demo,下面是进行再开发中自己写的符合业务需求
黑马程序员郑州中心 编著 的代码配合上述的word文档模板进行编写,代码改变度不大,自己可以琢磨一下: public void save(Page page,HttpServletResponse
response,httpServletRequest request){ //利用模板生成pdf //模板路径
String templatePath = “项目中的模板路径”;//生成的新文件路径
String newPDFPath = “要生成的文件的存放文件”;PdfReader reader;FileOutputStream out;ByteArrayOutputStream bos;PdfStamper stamper;try { //设置种字体,默认选中的是下面这个,在windows系统中是这样的,在其他的非windows系统中不敢保证:(不想用这种,可以在Adobe Acrobat去设置一个为Adobe 宋体 SL的字体,一下代码可以省略,并且不用在塞入数据是加入font字体,以下代码中的三处①一起使用,一起死亡)
//BaseFont bfChinese = BaseFont.createFont(“STSongStd-Light”, “UniGB-UCS2-H”, false);--①
//Font font = new Font(bfChinese, 10, Font.NORMAL);--①
out = new FileOutputStream(newPDFPath);//输出流
reader = new PdfReader(templatePath);//读取pdf模板
黑马程序员郑州中心 编著
bos = new ByteArrayOutputStream();stamper = new PdfStamper(reader, bos);
//读取pdf模板中的文本域们,(此处的用Adobe Acrobat编辑的模板没有截图,仿照上面的demo中的盗图进行对比)
AcroFields form = stamper.getAcroFields();
//form.setField(“studentName”, “font”,null,”数据”);//姓名中文--①
foem.setField(“studentName”, ”数据”);
form.setField(“sex”, “男”);//婚前姓名
stamper.setFormFlattening(true);//如果为false那么生成的PDF文件还能编辑,一定要设为true stamper.close();
Document doc = new Document();PdfCopy copy = new PdfCopy(doc, out);
//打开模板文档进行开始编辑: doc.open();
PdfImportedPage importPage =copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);copy.addPage(importPage);//此处一定要关闭,否则有一个进程会一直使用此模板文件,就会造成下载时报异常,此异常自己体会是什么异常: doc.close();
} catch(IOException e){
黑马程序员郑州中心 编著
System.out.println(1);
} catch(DocumentException e){ System.out.println(2);} }
到此处已经完成了此小小功能,希望能帮助一些遇到此问题的人,以下附上本人参考的大神播客地址: http:// http://zhuchengzzcc.iteye.com/blog/1603671
https://jingyan.baidu.com/article/295430f1fb049f0c7e0050d5.html
黑马程序员郑州中心 编著
篇2:黑马程序员心得
1、赋值构成一个表达式,具有值,其值为赋值符左边表达式的值。表达式和语句的一个重要区别是,表达式有值,而语句没有值。
2、隐式类型转换总是朝着表达数据能力更强的方向,并且转换总是逐个运算符进行的。如 float f=3.5;int n=6;long k=21;double ss=f*n+k/2;//在计算ss时,首先将f和n转换成double,算得21,然后计算k/2得10,再将10(long int)转换成double,最后得31。
27、C++基础笔记(一)墨涵天地 有符号数向无符号数转换。
3、当又有声明又有定义时,定义中不允许出现默认参数,如果函数只有定义,才允许默认参数出现在定义中。默认值可以是一个全局变量,全局常量,或是一个函数,但是不能是局部变量,因为默认参数的函数调用是在编译时确定的,而局部变量的位置和值在编译时是无法确定的。如 int a=1;void fun(){ int i;void g(int x=i);//not right int g(int x=a);//right
}
4、define宏定义指令
1)使用其定义常量已被C++中的const定义语句所代替。2)用来定义带参数的宏,已被C++的内联函数所代替。3)其一个有效的使用是在条件编译中。
5、编译时必须知道数组的大小。如
int a[]={1,2,3,4,5};//编译器会自动去数 for(int i=0;i 7、Free和malloc int* a;a=(int*)malloc(sizeof(int));cout< 8、指向常量的指针,指针常量,指向常量的指针常量 指向常量的指针:通过指针不能改变所指向的变量的值,但是指针的值可以变化(即指针可 以指向其它变量的地址)。形式如const int* pi=&a;原来的变量的访问属性也不会发生改变,如原来是普通变量,则其值可以变化,原来是常变量,则其值不能变化。 指针常量:在定义时必须初始化,且一旦赋值,则以后该指针的值将不会再发生变化(即不能再指向其它地址)。形如char* const pc=“abcd”;注意,pc的值是不能再改变了,但是*pc的值可以变化,如*pc=b;指向常量的指针常量:具有上述两具指针的特点,须在定义时初始化,且一旦赋值,则以后该指针的值将不会再发生变化,且通过指针不能改变所指向的变量的值,形如const int* const cpc=“perfect”;注意,这种情况下,*cpc的值也是不能改变的,如*cpc=n是不对的。int main(){ char* const pc=“abcd”;cout< } 9、sum(int array[],int n)与sum(int* array,int n)是等价的。 10、函数返回值,可以返回堆地址,也可以返回全局或静态变量的地址,但是不能返回局部变量的地址。 11、void指针是空类型指针,它不指任何类型,它仅仅是一个地址,不能进行指针运算,也不能进行间接引用。 NULL与void* 是不同的概念,NULL是一个指针值,任何类型的指针都可赋予该值。而void* 是一种类型(语法上是一个类型,本质上不是,没有任何一个变量或对象,其类型为void),是一种无任何类型的指针。不允许对void进行引用。 12、由引号(“ ”)标识,但不是用来初始化数组的字符串,是字符串常量,如cout<<“hello”< 由于字符串常量的地址属性,两个同样字符组成的字符串常量是不相等的,字符串常量的比较是地址的比较。 字符串常量,字符数组名(常量指针),字符指针均属于同一种数据类型。 13、不能建立引用的数组,因为数组是某个数据类型的集合,数组名表示起始地址,它不是数据类型。如 int a[10];int& a1[10]=a;//not right 引用本身不是一种数据类型(int&不是类型,定义时也不产生内存空间),所以没有引用的引用。也没有引用的指针。引用是变量或对象的引用,而不是类型的引用,所以有空指针,但是没有空引用。Int& ri=NULL //没有意义 可以用引用返回值。在通常情况下,C++会建立一个临时变量以将函数返回值带回。但是如果用引用,则不用建立临时变量。 C++规定,临时变量或对象的生命周期在一个完整的语句表达式结束后便宣告结束。所以如果以返回值初始化一个引用,应当先建立一个变量,将函数返回值赋于这个变量,作如下处理: int x=fn1(5.0);//在这一句后临时变量生命周期将结束 int& b=x;************************* float temp; float& fn2(float r){ temp=10*r;return temp;} 用如上的方法,则函数返回值将不再创建临时变量,而直接与全局变量temp共享内存单元 ******************************* 以引用的初始化,可以是变量,也以是常量,也可以是一定类型的堆空间变量,但是引用不是指针,如下表达是不对的: int& a=new int(2); //not right 下面是用堆空间变量初始化引用的一个例子: #include //...{ cin>>rd; cout< cout<<&rd; } delete& rd;//或delete pd return 1;} 注意:用double& rd来定义引用,而&rd则是取引用所指向的空间的地址。 14、声明一个结构并不分配内存,内存分配发生在定义这个新数据类型的变量中。结构不像数组,结构变量不是指针,&结构变量 取到的是结构中第一个成员变量的地址。结构变量可以相互赋值。结构成员不能作自身的结构变量,但是可以用结构指针作为成员。 15、将类定义和其它成员函数定义分开,是目前开发程序的通常做法。我们把类定义(头文件)看成是类的外部接口,类的成员函数定义看成是类的内部实现。 在当今社会中,需要使用自荐信的场合越来越多,自荐信可以帮助我们更好地提出请求。你还在为写自荐信而苦恼吗?以下是小编为大家整理的黑马程序员自荐信,仅供参考,希望能够帮助到大家。 尊敬的老师: 您好! 在阅读过几十份,甚至上百份的自荐信之后,或许,您已经有了些许疲倦与困意,但还是感谢您打开了我的这封自荐信。对于您来说,或许只是打开了一封信,而对于我来说,您为我开启了一扇窗,一扇可以看见未来,追逐梦想的的窗户。 我是赵玉杰,现在就读于沈阳建筑大学,理学院,信息与计算科学专业,目前大三。说起来,我也和黑马有点缘分,由于专业的.相近性,我在学校学习了c语言,c++语言,java语言,数据库(sql),数据结构(c语言版),计算机网络,操作系统等相关科目,算是有一点基础,但也仅仅只能是基础。这个社会需要的不是基础,而是真才实干。 力,获得足够的项目经验,掌握得心应手的实际操作……就是让我从众多毕业生里面脱颖而出的最佳选择。为了这一目标,我发现了黑马,一匹让我很惊讶的黑马!! “黑马程序员”成立于20xx年,20xx年正式上线运营。在短短的3年里,在it培训行业,“黑马程序员”不负众望的成为了一匹业界高度认可的黑马。在短短的四年时间里,“黑马程序员”为社会塑造了一大批it相关行业的精英。从黑马毕业的学员,得到了公司与社会的认可,实现了自己的社会价值,人生目标。在中关村软件园与csdn的大力支持下,在传智播客的教学实施下,“黑马程序员”已经成为了程序员的一种标榜,而能成为“黑马程序员”的一员,是每一个程序员的愿望,更是一种荣耀。而我更是殷切的希望能够成为黑马的一员,让我脱颖而出,让我底气十足。 1、已知一个int数组, 编程从数组中获取最大数.2、编写一个方法(名字自定,但要符合Java编码规范),方法内打印一字符串,并在main()方法内调用它。 3、环境变量path和classpath的作用是什么? 系统环境 path 为了更方便应用java 开发工具 将要执行命令的所在路径给系统、让系统去寻找 方便执行、必须是可执行文件先找当前路径再找path 路径 临时配置方式 通过set 命令完成、设置查看环境变量的值 在path环境变量的基础上添加新的目录 在任意目录下执行java 执行程序 专门给类文件设置路径 将class 文件所在目录 告诉系统,让系统去寻找 虚拟机先从classpath 寻找 4、UDP协议与TCP协议有什么不同? 5、编写一个类Person,为Person类定义年龄、姓名两个属性,并且定义一个SayHello方法,方法执行时输出“我是***我的年龄是***”;定义一个Chinese类从Person类继承。 6、创建一个包含有private的属性和private方法的类。然后创建一个内部类,它有一个方法可用来修改外部类的属性,并调用外部类的方法。在外部类的另一个方法中,创建此内部类的对象,并且调用它的方法。 7、用控制台程序输出九九乘法表;输出结果按下图所示: 1*1=1 1*2=22*2=4 1*3=32*3=63*3=9 在Java语言中,学好集合是非常重要的,下面简单的对集合进行总结,以便大家学习,有 问题再相互交流。 集合框架图 在集合框架图中可以看出,Collection接口中主要有两个子接口,分别是List和Set。List集合的特点是元素有序、包含重复元素,Set集合的特点是元素无序、不包含重复元素。Map集合中存储的是键值映射关系,元素都是成对出现的。Map接口的主要子接口有HashMap和TreeMap。 总结ist有顺序有重复没有排序,set无重复有排序,map的key也和set一样。 List接口 List : 特点是元素有序、可以包含重复元素。它有两个实现类分别是:ArrayList和LinkedList。 ArrayList : 内部维护一个数组结构,允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。 LinkedList : 内部维护了一个双向链表结构,即通过节点之间彼此连接来实现的,每一个节点都包含前一个节点和后一个节点的引用。当一个新节点插入时,只需要修改其中保持先后关系的节点引用即可,这样的存储结构保证了LinkedList集合在增删元素时效率非常高。 Set接口 Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面的List。实际上Set就是Collection只是行为不同,也就是说Set集合并没有对Collection接口进行扩充,只是比collection接口要求更加严了。 Set : 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。 HashSet : 为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。 TreeSet : 保存有序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。 LinkedHashSet : 具有HashSet的查询速度,且内部使用链表维护元素的顺序。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。 Map接口 Map用于保存具有映射关系的数据,因此Map集合里存储两组值,一组用于保存Map里的key,另一组用于保存Map中的value,key和value都可以是任意引用类型数据,其中,作为key的值是不允许重复的,而value中可以出现重复。Map : 维护“键值对”的关联性,使你可以通过“键”查找“值”。 HashMap就是使用对象的hashCode()进行快速查询的。此方法能够显著提高性能。HashMap集合是基于哈希表的Map接口实现,并允许使用null键null值,但必须保证键的唯一性。 LinkedHashMap : 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序。而在迭代访问时发而更快,因为它使用链表维护内部次序。 TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(顺序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。 Hashtable线程安全,但是存取速度很慢,且不允许存放null键null值,目前基本上被hashMap类所取代。Hashtable有一个重要的子类Properties。 Properties:java.util.Properties;key和value都是String类型,用来读配置文件。继承自Hashtable,比 Hashtable 更严格 属性列表中每个键及其对应值都是一个字符串。常用方法 String getProperty(String?key)和 setProperty(String key,String value); 用法:我在D盘下建了一个名为 AA.dat 的文件,文件的内容为: name=ch password=12345 1、IOS中常用的数据存储方式有哪些? 答:1.数据存储有四种方案,NSUserDefault,KeyChain,File,DB.2.其中File有三种方式:plist,Archiver,Stream 3.DB包括core Data和FMDB 2、说一说你对sqlite的认识 SQLite是目前主流的嵌入式关系型数据库,其最主要的特点就是轻量级、跨平台,当前很多嵌入式操作系统都将其作为数据库首选。虽然SQLite是一款轻型数据库,但是其功能也绝不亚于很多大型关系数据库。学习数据库就要学习其相关的定义、操作、查询语言,也就是大家日常说得SQL语句。和其他数据库相比,SQLite中的SQL语法并没有太大的差别,因此这里对于SQL语句的内容不会过多赘述,大家可以参考SQLite中其他SQL相关的内容,这里还是重点讲解iOS中如何使用SQLite构建应用程序。先看一下SQLite数据库的几个特点: 1.基于C语言开发的轻型数据库 2.在iOS中需要使用C语言语法进行数据库操作、访问(无法使用ObjC直接访问,因为libqlite3框架基于C语言编写) 3.SQLite中采用的是动态数据类型,即使创建时定义了一种类型,在实际操作时也可以存储其他类型,但是推荐建库时使用合适的类型(特别是应用需要考虑跨平台的情况时) 4.建立连接后通常不需要关闭连接(尽管可以手动关闭) 在iOS中操作SQLite数据库可以分为以下几步(注意先在项目中导入libsqlite3框架): 1.打开数据库,利用sqlite3_open()打开数据库会指定一个数据库文件保存路径,如果文件存在则直接打开,否则创建并打开。打开数据库会得到一个sqlite3类型的对象,后面需要借助这个对象进行其他操作。 2.执行SQL语句,执行SQL语句又包括有返回值的语句和无返回值语句。3.对于无返回值的语句(如增加、删除、修改等)直接通过sqlite3_exec()函数执行; 4.对于有返回值的语句则首先通过sqlite3_prepare_v2()进行sql语句评估(语法检测),然后通过sqlite3_step()依次取出查询结果的每一行数据,对于每行数据都可以通过对应的sqlite3_column_类型()方法获得对应列的数据,如此反复循环直到遍历完成。当然,最后需要释放句柄。 3、说一说你对FMDB的认识 FMDB是一个处理数据存储的第三方框架,框架是对sqlite的封装,整个框架非常轻量级但又不失灵活性,而且更加面向对象。FMDB有如下几个特性: 1.FMDB既然是对于libsqlite3框架的封装,自然使用起来也是类似的,使用前也要打开一个数据库,这个数据库文件存在则直接打开否则会创建并打开。这里FMDB引入了一个MFDatabase对象来表示数据库,打开数据库和后面的数据库操作全部依 赖此对象。 2.对于数据库的操作跟前面KCDbManager的封装是类似的,在FMDB中FMDatabase类提供了两个方法executeUpdate:和executeQuery:分别用于执行无返回结果的查询和有返回结果的查询。当然这两个方法有很多的重载这里就不详细解释了。唯一需要指出的是,如果调用有格式化参数的sql语句时,格式化符号使用“?”而不是“%@”、等。 3.我们知道直接使用libsqlite3进行数据库操作其实是线程不安全的,如果遇到多个线程同时操作一个表的时候可能会发生意想不到的结果。为了解决这个问题建议在多线程中使用FMDatabaseQueue对象,相比FMDatabase而言,它是线程安全的。 4.将事务放到FMDB中去说并不是因为只有FMDB才支持事务,而是因为FMDB将其封装成了几个方法来调用,不用自己写对应的sql而已。其实在在使用libsqlite3操作数据库时也是原生支持事务的(因为这里的事务是基于数据库的,FMDB还是使用的SQLite数据库),只要在执行sql语句前加上“begin transaction;”执行完之后执行“commit transaction;”或者“rollback transaction;”进行提交或回滚即可。另外在Core Data中大家也可以发现,所有的增、删、改操作之后必须调用上下文的保存方法,其实本身就提供了事务的支持,只要不调用保存方法,之前所有的操作是不会提交的。在FMDB中FMDatabase有beginTransaction、commit、rollback三个方法进行开启事务、提交事务和回滚事务。 4、说一说你对Core Data的认识 Core Data使用起来相对直接使用SQLite3的API而言更加的面向对象,操作过 程通常分为以下几个步骤: 1.创建管理上下文 创建管理上下可以细分为:加载模型文件->指定数据存储路径->创建对应数据类型的存储->创建管理对象上下方并指定存储。 经过这几个步骤之后可以得到管理对象上下文NSManagedObjectContext,以后所有的数据操作都由此对象负责。同时如果是第一次创建上下文,Core Data会自动创建存储文件(例如这里使用SQLite3存储),并且根据模型对象创建对应的表结构。 2.查询数据 对于有条件的查询,在Core Data中是通过谓词来实现的。首先创建一个请求,然后设置请求条件,最后调用上下文执行请求的方法。 3.插入数据 插入数据需要调用实体描述对象NSEntityDescription返回一个实体对象,然后设置对象属性,最后保存当前上下文即可。这里需要注意,增、删、改操作完最后必须调用管理对象上下文的保存方法,否则操作不会执行。 4.删除数据 删除数据可以直接调用管理对象上下文的deleteObject方法,删除完保存上下文即可。注意,删除数据前必须先查询到对应对象。 5.修改数据 修改数据首先也是取出对应的实体对象,然后通过修改对象的属性,最后保存上下文。 5、OC中有哪些数据存储方式,各有什么区别? OC中有四种数据存储方式: 1).NSUserDefaults,用于存储配置信息 2).SQLite,用于存储查询需求较多的数据 3).CoreData,用于规划应用中的对象 4).使用基本对象类型定制的个性化缓存方案.NSUserDefaults:对象中储存了系统中用户的配置信息,开发者可以通过这个实例对象对这些已有的信息进行修改,也可以按照自己的需求创建新的配置项。SQLite擅长处理的数据类型其实与NSUserDefaults差不多,也是基础类型的小数据,只是从组织形式上不同。开发者可以以关系型数据库的方式组织数据,使用SQL DML来管理数据。一般来说应用中的格式化的文本类数据可以存放在数据库中,尤其是类似聊天记录、Timeline等这些具有条件查询和排序需求的数据。CoreData是一个管理方案,它的持久化可以通过SQLite、XML或二进制文件储存。它可以把整个应用中的对象建模并进行自动化的管理。从归档文件还原模型时CoreData并不是一次性把整个模型中的所有数据都载入内存,而是根据运行时状态,把被调用到的对象实例载入内存。框架会自动控制这个过程,从而达到控制内存消耗,避免浪费。无论从设计原理还是使用方法上看,CoreData都比较复杂。因此,如果仅仅是考虑缓存数据这个需求,CoreData绝对不是一个优选方案。CoreData的使用场景在于:整个应用使用CoreData规划,把应用内的数据通过CoreData建模,完全基于CoreData架构应用。使用基本对象类型定制的个性化缓存方案:从需求出发分析缓存数据有哪些要求:按Key查找,快速读取,写入不影响正常操作,不浪费内存,支持归档。这些都是基本需求,那么再进一步或许还需要固定缓存项数量,支持队列缓存,缓存过期等。 数据存储这一块,面试常问, 你常用哪一种数据存储?什么是序列化?sqlite是直接用它还是用封装了它的第三方库?尤其是会问sqlite和core data的区别? 5、IOS平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗? iOS中可以有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data coredata可以使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。coredata提供了基础结构去处理常用的功能,例如保存,恢复,撤销和重做,允许你在app中继续创建新的任务。在使用coredata的时候,你不用安装额外的数据库系统,因为coredata使用内置的sqlite数据库。coredata将你app的模型层放入到一组定义在内存中的数据对象。coredata会追踪这些对象的改变,同时可以根据需要做相应的改变,例如用户执行撤销命令。当coredata在对你app数据的改变进行保存的时候,core data会把这些数据归档,并永久性保存。mac os x中sqlite库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。可以在多个平台使用,sqlite是一个轻量级的嵌入式sql数据库编程。与coredata框架不同的是,sqlite是使用程序式的,sql的主要的API来直接操作数据表。Core Data不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS)。虽然Core Dta支持SQLite作为一种存储类型, 但它不能使用任意的SQLite数据库。Core Data在使用的过程种自己创建这个数据库。Core Data支持对 一、对多的关系。 6、如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢? 编写SQL语句来操作原来表中的字段 增加表字段 ALTER TABLE 表名 ADD COLUMN 字段名字段类型;• 删除表字段 ALTER TABLE 表名 DROP COLUMN 字段名; .修改表字段 ALTER TABLE 表名 RENAME COLUMN 旧字段名 TO 新字段名; 7、SQLite数据存储是怎么用? 添加SQLite动态库: 导入主头文件:#import 8、简单描述下客户端的缓存机制? 1>缓存可以分为:内存数据缓存、数据库缓存、文件缓存 2>每次想获取数据的时候 3>先检测内存中有无缓存 4>再检测本地有无缓存(数据库文件)5>最终发送网络请求 6>将服务器返回的网络数据进行缓存(内存、数据库、文件),以便下次读取 9、你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在线程中创建或者传递?你是用什么样的策略来实现的? 1>CoreData是对SQLite数据库的封装 2>CoreData中的NSManagedObjectContext在多线程中不安全 3>如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext 4>每个NSManagedObjectContext对象实例都可以使用同一个NSPersistentStoreCoordinator实例,这是因为NSManagedObjectContext会在便用NSPersistentStoreCoordinator前上锁 10、core data数据迁移 博客地址: http://blog.csdn.net/jasonblog/article/details/17842535 11、FMDB的使用和对多张表的处理 博客地址: http://blog.csdn.net/wscqqlucy/article/details/8464398 12、说说数据库的左连接和右连接的区别 之前写了“Java之debug总结一”,“Java之debug总结二”共总结了5种debug方式,现在简绍第6种,不足之处,敬请指正:(源码在文章末尾处)本文以chrome浏览器为例 六.前台debug 主要:debug js代码(1.jsp中嵌入的js代码 2.js文件中的js代码)第一步:首先创建一个web项目,需要有一个jsp页面和js,如下图: 第二步:在test.js,index.jsp中填充内容,如图示: index.jsp 黑马程序员济南中心 编著 test.js 第三步:把项目发布到tomcat服务器中,并启动tomcat服务器 第四步:在浏览器上访问index.jsp,使用“F12”打开chrome开发者工具,如下图: 黑马程序员济南中心 编著 选中“Source”,点击,出现如下界面 黑马程序员济南中心 编著 点击“[url=]encode测试[/url]”按钮进行测试 以上为外部js代码测试,测试过程中可以修改js的内容,“Ctrl+s”保存后,可以立马生效,断点会从第一行从新开始.黑马程序员济南中心 编著 内部js测试步骤类似于上面的步骤,只是在选择资源的时候不是选择“test.js”,而是选择“index”,选择后页面如下图: 测试步骤和外部js一样 比较外部js和内部js的区别: 外部js,可以进行动态的修改, 修改之后立马生效,并且可以立马进行测试.内部js,不可以动态修改,用起来有点不方便 以上以我用过的所有debug方式,希望对大家有所帮助 一、迪拜七星级酒店靠软文获得10%的中国客商。 迪拜有个七星级酒店,建筑在一个人工岛上,当时在中国他们没有做任何关于迪拜的广告,只是在《长江商报》和《北京青年报》上名为“全球唯一七星级酒店:24吨黄金装饰”“迪拜七星级酒店六成中国客商,消费能力让人吃惊”的报道,后陆续呗新华网、人民网、搜狐、腾讯等各大门户网站转载,剧统计,二、脑白金软文赢天下。 众所周知,史玉柱曾经用借来的50万做脑白金的产品,然后迅速打开销路,成功扭转了团队面临的严峻考验。而脑白金的成功很大一部分是靠“软文营销”,他们具体的做法是先在一些权威的报社、网站发布关于健康的文章,引起人们的争议,如“人类可以长生不老吗?”“一天不大便等于抽三包烟”“女人四十是花还是豆腐渣”等,软文发布后迅速打开了客户主动找产品的局面。 对于“软文营销”的初入行者,无论有没有经过实践都会存在一些疑问,只有存在疑问才证明是思考过的,只有认真去思考才会有所心得,下面这些问题看你知道答案吗?我相信无论是目前处于一种什么心态,思考完这些问题你一定会对“软文营销”有一个初步的了解。 问:软文营销合法吗? 问:软文营销适合哪些行业? 问:软文营销需要投入多少费用? 问:软文营销的周期是多久? 问:软文推广就是软文营销吗? 问:一些企业做过软文为什么没有效果? 问:软文营销的优势体现在哪些方面? 问:如何培养写软文的能力? 问:软文的字数是多少合适? 问:网络软文的关键词如何寻找和设置? 问:网络软文的长尾关键词如何拓展? 问:如何迅速脱离不能写网络软文的困扰? 问:为什么提倡软硬原创性? 问:论坛软文有哪些特点? 问:论坛软文账号被删被封怎么办? 问:如何选择论坛发布论坛软文? 问:论坛软文常用技巧有哪些? 以上问题答案回帖可见: 问:软文营销合法吗? 答:对于虚假广告我们国家是命令禁止的,进而任何一种营销方式只要是虚假的都是犯法的,正因如此,我们做软文营销要怀有一颗社会责任心,拒绝以欺骗为目的的各类山寨网站做软文营销,软文营销中注意不要多度夸大产品功效、服务水平等,故,软文营销对于软文调研、策划、撰写、发布和评估各个环节都提出了更高的要求。问:软文营销适合哪些行业? 答:几乎适合所有行业。问:软文营销需要投入多少费用? 答:企业开展软文营销应该量力而行,可以根据开展的情况随时灵活调整,建议投入的费用不超过公司销售业绩的5%。问:软文营销的周期是多久? 答:从青泉操作的多个成功案例来看,软文营销的周期一般在一年左右。整体策略是先集中发力,然后根据效果监测和市场评估灵活调整,保持一定的热度即可。当然,如果为了配合某一项活动或者项目的推广,周期可以缩短一些。问:软文推广就是软文营销吗? 答:不是。把“软文推广”看成“软文营销”是许多企业常犯的错误。软文推广实际上是“软文营销”的一个环节。“软文营销”是以营销的理念作为指导,以软文作为具体表现形式的营销方式,其中包括调研、策划、撰写、发布、评估等系列流程。 问:一些企业做过软文为什么没有效果? 答:试想一下,一个企业请一个写手来写了几篇软文,然后随意找了几个平台发布出去了,即使撰写的软文水平很高,那么会有很好的效果吗?效果肯定不会很理想!因为进行“软文营销”一定得严格按照软文营销的流程来进行。问:软文营销的优势体现在哪些方面? 答:首先是速度快,传播范围广。其次是传播更精确。问:如何培养写软文的能力? 答:经常锻炼语言表达能力即可。最简单的办法就是用一句话概括一件事,然后把这件事在用一段话来描述,在从这件事中找出亮点和可塑造的话题,反复锻炼,久而久之自然就连成篇幅了。只要记住“贵在坚持”就行了。问:软文的字数是多少合适? 答:标题的字数控制在16字-20字之间。正文字数控制在500-1500字之间。平面媒体软文根据报纸和媒体的版面来控制字数即可。问:网络软文的关键词如何寻找和设置? 答:关键词的选定要根据用户的喜好,先把自己设定为用户,想想目标用户会搜索什么?也可以列出一些让老客户给些建议,当然一定要注意,软文关键词是否和文章能融合在一起。问:网络软文的长尾关键词如何拓展? 答:1.加入产品的质地、特点和功能。2.增加应用领域和地域。 3.增加商业模式、企业性质和销售服务模式。4.利用网民搜索意图。 问:如何迅速脱离不能写网络软文的困扰? 答:每天坚持写一点,一周就会有效果,先标题开始练习,在到段落练习,再到结尾练习。 也可以从最容易的软文表现形式开始练习,如访谈式和观点式。问:为什么提倡软硬原创性? 答:原创不仅读者喜欢,搜索引擎更喜欢,软文营销加之搜索引擎的帮助效果会事半功倍。问:论坛软文有哪些特点? 答:论坛软文应该具备如下三个特点? 第一:足够诱惑力的标题。第二:引人入胜的开头。 第三:开放式的结尾,一定给会员留下可以互动的悬念。问:论坛软文账号被删被封怎么办? 答:选择好论坛后,先浏览公告板块,了解论坛管理规则和管理思路,尽量去遵守这些规则和要求,至少注册4个论坛账号。问:如何选择论坛发布论坛软文? 答:选择精准度高、人气旺盛、活跃性好及粘度高的论坛。具体来说选择论坛可以从用户数、在线用户数、热门板块文章的浏览量和回帖量来分析。问:论坛软文常用技巧有哪些? 1.谈谈你对Core Graphic 绘图的了解? CoreGraphics也称为Quartz 2D 是UIKit下的主要绘图系统,频繁的用于绘制自定义视图。Core Graphics是高度集成于UIView和其他UIKit部分的。Core Graphics数据结构和函数可以通过前缀CG来识别。 视图可以通过子视图、图层或实现drawRect:方法来表现内容,如果说实现了drawRect:方法,那么最好就不要混用其他方法了,如图层和子视图。自定义绘图大部分是由UIKit或者Core Graphics来实现的。 2D绘图一般可以拆分成以下几个操作: 线条 , 路径 , 文本 , 图片 , 渐变 由于像素是依赖于目标的,所以2D绘图并不能操作单独的像素,我们可以从上下文(Context)读取它。 绘图就好比在画布上拿着画笔机械的进行画画,通过制定不同的参数来进行不同的绘制。 http:///articles/jIJzMf http://blog.csdn.net/mangosnow/article/details/37054765 2.Core Animation(核心动画)? CoreAnimation也就是核心动画, 是一组非常强大的动画处理API, 可以使用少量的代码做出绚丽的效果, 是直接作用在CALayer上的, 并非UIView, 并且Core Animation的动画执行过程都是在后台操作, 不会阻塞主线程.所有动画都是作用在CALayer上的, 当把动画添加到Layer上, 是不直接修改它的属性, Core Animation维护了两个平行layer的层次结构, 模型层树可以看到Layer的状态, 表示层树则是动画正在表现的值的近似.Core Animation的使用步骤: 1> 使用它需要先添加QuartzCore.framework框架和引入主头文件 3>.通过调用CALayer的addAnimation:forKey:方法增加CAAnimation对象到CALayer中,这样就能开始执行动画了 4>.通过调用CALayer的removeAnimationForKey:方法可以停止CALayer中的动画 1.转场动画? CATransition-转场动画, 作为CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点.UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果.如下是转场动画的过渡效果: 使用UIView的动画函数, 实现转场动画 1> 单视图: +(void)transitionWithView:(UIView*)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void(^)(void))animations completion:(void(^)(BOOL finished))completion;参数说明: duration:动画的持续时间 view:需要进行转场动画的视图 options:转场动画的类型 animations:将改变视图属性的代码放在这个block中 completion:动画结束后,会自动调用这个block 2> 双视图: +(void)transitionFromView:(UIView*)fromView toView:(UIView*)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options finished))completion;参数说明: duration:动画的持续时间 options:转场动画的类型 animations:将改变视图属性的代码放在这个block中 completion:动画结束后,会自动调用这个block completion:(void (^)(BOOL 2.一个动画怎么实现? 以转场动画为例: 1> 创建CATransition对象 CATransition *animation = [CATransition animation];2> 设置运动时间(即动画时间)animation.duration = DURATION;3> 设置运动type(类型) animation.type = type;if(subtype!= nil){ 4> 设置子类(和type配合使用, 指定运动的方向)animation.subtype = subtype;} 5> 设置运动速度(动画的运动轨迹,用于变化起点和终点之间的插值计算,形象点说它决定了动画运行的节奏,比如是均匀变化(相同时间变化量相同)还是先快后慢,先慢后快还是先慢再快再慢)animation.timingFunction = UIViewAnimationOptionCurveEaseInOut; 6> 将动画添加到view的Layer层 [view.layer addAnimation:animation forKey:@“animation”];动画类型如下: typedef enum : NSUInteger { Fade = 1, //淡入淡出 Push, //推挤 Reveal, //揭开 MoveIn, //覆盖 Cube, //立方体 SuckEffect, //吮吸 OglFlip, //翻转 RippleEffect, //波纹 PageCurl, //翻页 PageUnCurl, //反翻页 CameraIrisHollowOpen, //开镜头 CameraIrisHollowClose, //关镜头 CurlDown, //下翻页 CurlUp, //上翻页 FlipFromLeft, //左翻转 FlipFromRight, //右翻转 } AnimationType;3.CADisplayLink CADisplayLink是一种以屏幕刷新频率触发的时钟机制,每秒钟执行大约60次左右 CADisplayLink是一个计时器,可以使绘图代码与视图的刷新频率保持同步,而NSTimer无法确保计时器实际被触发的准确时间 使用方法: 【黑马程序员心得】相关文章: springmvc黑马程序员07-21 黑马程序员springmvc08-17 黑马程序员c语言05-25 黑马程序员面试技巧08-14 黑马程序员python笔记04-19 黑马程序员java教程06-22 黑马程序员c语言讲义07-25 黑马程序员PHP培训教程:同步和异步05-07 黑马程序员PHP培训教程:Linux安装05-20篇3:黑马程序员自荐信
篇4:黑马程序员基础测试题
篇5:黑马程序员心得
篇6:黑马程序员心得
篇7:黑马程序员心得
篇8:黑马程序员:经典软文营销20问
篇9:黑马程序员心得